豪情万千的汽水 · 老板让我“996”,可颈椎受不了!快来试试这 ...· 4 月前 · |
绅士的鸡蛋面 · 黑沼泽俱乐部蔷薇后花园 - 抖音· 4 月前 · |
怕考试的仙人球 · 韩国主播BJ 韩宝贝 VIP ...· 6 月前 · |
骑白马的香菜 · 电子电路基础 ...· 6 月前 · |
不敢表白的豆浆 · 『广播剧』翡翠岛之熬鹰Ⅰ_哔哩哔哩_bili ...· 7 月前 · |
我对JPA2比较陌生,它是CriteriaBuilder / CriteriaQuery API:
CriteriaQuery
in the Java EE 6 tutorial
我想对CriteriaQuery的结果进行计数,而不实际检索它们。有没有可能,我没有找到这样的方法,唯一的办法就是这样做:
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<MyEntity> cq = cb
.createQuery(MyEntityclass);
// initialize predicates here
return entityManager.createQuery(cq).getResultList().size();
这不可能是正确的方式。
有解决方案吗?
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Long> cq = cb.createQuery(Long.class);
cq.select(cb.count(cq.from(MyEntity.class)));
return em.createQuery(cq).getSingleResult();
类型为
MyEntity
的查询将返回
MyEntity
。您想要查询一个
Long
。
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();
显然,您将希望使用在示例中跳过的任何限制和分组等构建表达式。
我已经使用cb.createQuery() (不带result类型参数)解决了这个问题:
public class Blah() {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery query = criteriaBuilder.createQuery();
Root<Entity> root;
Predicate whereClause;
EntityManager entityManager;
Class<Entity> domainClass;
... Methods to create where clause ...
public Blah(EntityManager entityManager, Class<Entity> domainClass) {
this.entityManager = entityManager;
this.domainClass = domainClass;
criteriaBuilder = entityManager.getCriteriaBuilder();
query = criteriaBuilder.createQuery();
whereClause = criteriaBuilder.equal(criteriaBuilder.literal(1), 1);
root = query.from(domainClass);
public CriteriaQuery<Entity> getQuery() {
query.select(root);
query.where(whereClause);
return query;
public CriteriaQuery<Long> getQueryForCount() {
query.select(criteriaBuilder.count(root));
query.where(whereClause);
return query;
public List<Entity> list() {
TypedQuery<Entity> q = this.entityManager.createQuery(this.getQuery());
return q.getResultList();
public Long count() {
TypedQuery<Long> q = this.entityManager.createQuery(this.getQueryForCount());
return q.getSingleResult();
}
希望它能有所帮助:)
这有点棘手,这取决于你使用的JPA2实现,它适用于EclipseLink 2.4.1,但不适用于Hibernate,这里是EclipseLink的通用CriteriaQuery计数:
public static Long count(final EntityManager em, final CriteriaQuery<?> criteria)
final CriteriaBuilder builder=em.getCriteriaBuilder();
final CriteriaQuery<Long> countCriteria=builder.createQuery(Long.class);
countCriteria.select(builder.count(criteria.getRoots().iterator().next()));
final Predicate
groupRestriction=criteria.getGroupRestriction(),
fromRestriction=criteria.getRestriction();
if(groupRestriction != null){
countCriteria.having(groupRestriction);
if(fromRestriction != null){
countCriteria.where(fromRestriction);
countCriteria.groupBy(criteria.getGroupList());
countCriteria.distinct(criteria.isDistinct());
return em.createQuery(countCriteria).getSingleResult();
}
前几天我从EclipseLink迁移到Hibernate,不得不将我的count函数更改为以下函数,所以请随意使用,因为这是一个很难解决的问题,它可能不适用于您的情况,它从Hibernate 4.x开始就一直在使用,请注意,我不会尝试猜测哪个是根,而是从查询中传递它,所以问题解决了,太多模棱两可的情况让人难以猜测:
public static <T> long count(EntityManager em,Root<T> root,CriteriaQuery<T> criteria)
final CriteriaBuilder builder=em.getCriteriaBuilder();
final CriteriaQuery<Long> countCriteria=builder.createQuery(Long.class);
countCriteria.select(builder.count(root));
for(Root<?> fromRoot : criteria.getRoots()){
countCriteria.getRoots().add(fromRoot);
final Predicate whereRestriction=criteria.getRestriction();
if(whereRestriction!=null){
countCriteria.where(whereRestriction);
final Predicate groupRestriction=criteria.getGroupRestriction();
if(groupRestriction!=null){
countCriteria.having(groupRestriction);
countCriteria.groupBy(criteria.getGroupList());
countCriteria.distinct(criteria.isDistinct());
return em.createQuery(countCriteria).getSingleResult();
}
您还可以使用投影:
ProjectionList projection = Projections.projectionList();
projection.add(Projections.rowCount());
criteria.setProjection(projection);
Long totalRows = (Long) criteria.list().get(0);
绅士的鸡蛋面 · 黑沼泽俱乐部蔷薇后花园 - 抖音 4 月前 |