首页 > 解决方案 > 如何使用 Spring 和 JPA 获取具有多个参数的实体

问题描述

假设我有一个网站,用户可以在该网站上选择多种参数。
我可以用SQL写出我需要的东西,但问题是可能有很多OR(很多多值参数):

SELECT * FROM vacancy JOIN types t on vacancy.id = t.id  
WHERE (company ='Luxoft' OR company LIKE '%SoftServe%' OR...)  
AND (location LIKE 'Kiev' OR location LIKE 'Lviv' OR..)  
AND (type like 'Java' OR type like 'JavaScript' OR..)

现在我正在通过从我的数据库中获取所有空缺,遍历所有空缺,保存那些包含所需 TITLE 的空缺,然后我从这个新保存的空缺中迭代并找到那些具有所需公司参数之一的空缺,位置参数类型参数。
但是因为现在我有多种类型的空缺,这些空缺被映射到空缺数据库,@ElementCollection并且@CollectionTable类型的获取变得非常慢。
我想到了 Spring ExampleMatcher,但我不确定它是否可以做到这一点。
谢谢。

标签: javasqlspringhibernatejpa

解决方案


    CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
    CriteriaQuery<EntityName> c = cb.createQuery(EntityName.class);
    Root<EntityName> root = c.from(EntityName.class);


    Predicate company = cb.or ( 
        cb.equal(root.<String>get("company"), "Luxoft"),
        cb.like(root.<String>get("name"), "%SoftServe%"));

    Predicate location = cb.or ( 
        cb.equal(root.<String>get("location"), "Kiev"),
        cb.like(root.<String>get("location"), "%Lviv%"));

    Expression<String> typeExpression = root.get("type");

    Predicate type = typeExpression.in("Java", "Javascript");

    c.where(company, location, type);

    return c.getResultList();

CriteriaBuilderHibernate和CriteriaQuery类将帮助您使用代码创建此类查询。


推荐阅读