如何将 JPA 调整为 Criteriaquery

Posted

技术标签:

【中文标题】如何将 JPA 调整为 Criteriaquery【英文标题】:how do size JPA to Criteriaquery 【发布时间】:2016-04-12 10:13:01 【问题描述】:

我有这个 Java 代码:

CriteriaBuilder qb = entityManager.getCriteriaBuilder(); 
CriteriaQuery<Long> cq = qb.createQuery(Long.class);
cq.select(qb.count(cq.from(MyEntity.class))); 
cq.where(/*your stuff*/); 
return entityManager.createQuery(cq).getSingleResult();

我想做一个条件查询:

SELECT COUNT(p),pa.nomPays FROM SessionPersonne s JOIN s.personne p , 
p.entreprise e , e.adresse a , a.localite l , l.pays pa , s.session session 
WHERE size(s.passageCollection)  > 0   GROUP BY pa.nomPays

但是size(s.passageCollection) &gt; 0 如何处理关键查询?

谢谢。

【问题讨论】:

为什么这被标记为java相关? 因为 criteriaquery criteriabuilder 和 java 不是 ?CriteriaBuilder qb = entityManager.getCriteriaBuilder(); CriteriaQuery cq = qb.createQuery(Long.class); cq.select(qb.count(cq.from(MyEntity.class))); cq.where(/*你的东西*/); return entityManager.createQuery(cq).getSingleResult(); 请将您的 java 代码添加到您的问题中,这将使您更容易理解您要做什么。 我想将 JPA 代码转换为 criteriaBuilder 我要添加 java 代码 【参考方案1】:

本教程很好地解释了一切。 http://www.baeldung.com/jpa-pagination

以防万一链接中断,我将添加一个段并添加应该放置的位置

int pageNumber = 1;
int pageSize = 10;
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();

CriteriaQuery<Long> countQuery = criteriaBuilder.createQuery(Long.class);
countQuery.select(criteriaBuilder.count(countQuery.from(Foo.class)));
Long count = entityManager.createQuery(countQuery).getSingleResult();

CriteriaQuery<Foo> criteriaQuery = criteriaBuilder.createQuery(Foo.class);
Root<Foo> from = criteriaQuery.from(Foo.class);
CriteriaQuery<Foo> select = criteriaQuery.select(from);
select.where(criteriaBuilder.equal(fromRoot.get("entityColumb"), "bar")));

TypedQuery<Foo> typedQuery = entityManager.createQuery(select);
while (pageNumber < count.intValue()) 
    typedQuery.setFirstResult(pageNumber - 1);
    typedQuery.setMaxResults(pageSize);
    System.out.println("Current page: " + typedQuery.getResultList());
    pageNumber += pageSize;

【讨论】:

【参考方案2】:

您可以按如下方式获取用于 Criteria 的 SIZE

Expression<Integer> sizeExpr = qb.size(SessionPersonne_.passageCollection)

因此

qb.greaterThan(sizeExpr, 0);

【讨论】:

以上是关于如何将 JPA 调整为 Criteriaquery的主要内容,如果未能解决你的问题,请参考以下文章

日期之间的 JPA 2.1 CriteriaQuery

JPA 2 CriteriaQuery,使用限制

如何在具有枚举字段的实体上使用 JPA CriteriaQuery 填充 DTO 类字符串字段?

向 JPA CriteriaQuery 添加连接

JPA CriteriaQuery - 不区分重音

CriteriaQuery JPA 2 问题与结果