如何使用Spring和JPA获取具有多个参数的实体

时间:2018-07-13 20:28:42

标签: java sql spring hibernate 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,但不确定它能做到这一点。
谢谢。

1 个答案:

答案 0 :(得分:2)

    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();
Hibernate的

CriteriaBuilderCriteriaQuery类将帮助您使用代码创建此类查询。