JPA Criteria构建器IN子句查询

问题描述 投票:19回答:3

如何为下面给出的JPQL查询编写条件生成器api查询?我正在使用JPA 2.2

SELECT * 
FROM Employee e
WHERE e.Parent IN ('John','Raj')
ORDER BY e.Parent
java jpa orm jpa-2.0 openjpa
3个回答
40
投票

这个标准设置应该可以解决问题:

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Employee> q = cb.createQuery(Employee.class);


Root<Employee> root = q.from(Employee.class);
q.select(root);

List<String> parentList = Arrays.asList(new String[]{"John", "Raj"});

Expression<String> parentExpression = root.get(Employee_.Parent);
Predicate parentPredicate = parentExpression.in(parentList);
q.where(parentPredicate);
q.orderBy(cb.asc(root.get(Employee_.Parent));

q.getResultList();

我在这里使用了重载的CriteriaQuery.where方法,它接受Predicate ..在这种情况下的in谓词。


1
投票
You can also do this with Criteria API In clause as below:

     CriteriaBuilder cb = 
     entityManager.getCriteriaBuilder();
     CriteriaQuery<Employee> cq = 
     cb.createQuery(Employee.class);
     Root<Employee> root = 
     cq.from(Employee.class);
     List<String> parentList = 
     Arrays.asList("John", "Raj" );
     In<String> in = 
     cb.in(root.get(Employee_parent));
     parentList.forEach(p -> in.value(p));
     return   entityManager
             .createQuery(cq.select(root) 
             .where(in).orderBy(cb.asc(root.get(Employee_.Parent))) 
             .getResultList();

检查我的github以及几乎所有可能的标准示例。

https://github.com/vaneetkataria/Jpa-Hibernate/blob/master/jdbcToJpaMigration/src/test/java/com/katariasoft/technologies/jpaHibernate/entity/criteria/SingleTableCriteriaFetchTests.java


1
投票

当您需要使用Criteria API再次执行此操作时,不要打破头脑 - 您可以为Dao创建父包装类并在其中放置一个hepler方法:

/**
  * An SQL "WHERE IN" expression alternative.
  *
  * @param inList List to search in.
  * @param pathToEntityField Path to a field in your entity object.
  * @return A ready predicate-condition to paste into CriteriaQuery.where().
  */
 @SuppressWarnings("unchecked")
 private Predicate in(List<?> inList, Expression pathToEntityField) {

   return pathToEntityField.in(inList);
}

使用WHERE IN然后喜欢:

query.where(**in**(myList, root.get(MyTypedEntity_.id)));

0
投票

我希望它可能有用。在Entry只有一个@Id列时测试的代码:

public static <Entry, Id> List<Entry> getByIds(List<Id> ids, Class<Entry> clazz, EntityManager entityManager) throws CustomDatabaseException
{
    List<Entry> entries;
    try
    {
        CriteriaBuilder cb = entityManager.getCriteriaBuilder();
        CriteriaQuery<Entry> q = cb.createQuery(clazz);
        Root<Entry> root = q.from(clazz);
        EntityType<Entry> e = root.getModel();
        CriteriaQuery<Entry> all = q.where(root.get(e.getId(e.getIdType().getJavaType()).getName()).in(ids));

        TypedQuery<Entry> allQuery = entityManager.createQuery(all);
        entries = allQuery.getResultList();
    }
    catch (NoResultException nre)
    {
        entries = Collections.emptyList()
    }
    catch (Exception e)
    {
        throw new CustomDatabaseException(e);
    }
    return entries;
}
© www.soinside.com 2019 - 2024. All rights reserved.