如何使用分组进行条件查询
How to make Criteria Query with grouping
select CreatedBy, count(*) as cnt
from fourwheelerquoteresponse
group by CreatedBy
order by count(*) desc
limit 5;
这是我的 sql 我根据 JPA 标准想要它 API 仍然不确定
这是我的查询,它返回整个列表而不考虑组
@Override
public List<FourWheelerQuoteResponseEntity> findAllByTopOrLow(String createdBy) {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<FourWheelerQuoteResponseEntity> criteriaQuery = criteriaBuilder.createQuery(FourWheelerQuoteResponseEntity.class);
Root<FourWheelerQuoteResponseEntity> root = criteriaQuery.from(FourWheelerQuoteResponseEntity.class);
Expression<String> groupByExp = root.get("createdBy").as(String.class);
Expression<Long> countExp = criteriaBuilder.count(groupByExp);
CriteriaQuery<FourWheelerQuoteResponseEntity> select =
criteriaQuery.multiselect(groupByExp, countExp);
criteriaQuery.groupBy(groupByExp);
criteriaQuery.orderBy(criteriaBuilder.desc(countExp));
criteriaQuery.select(root)
.where(criteriaBuilder.equal(root.get("createdBy"), createdBy));
try {
return entityManager.createQuery(select).getResultList();
} catch (NoResultException nre) {
return null;
} catch (NonUniqueResultException nure) {
return null;
}
}
在 MySQL (?) 或 Hibernate 上表达查询的语法非常相似:
select entity.createdBy, count(entity)
from FourWheelerQuoteResponseEntity entity
group by entity.createdBy
order by count(entity) desc
limit 5
参考下面的代码,我相信这会解决你的问题。如果没有,请告诉我
@Override
@Transactional(readOnly = true)
public Map<String,Long> topOrLowFew(List<String> userIdList,String order,int howMany) {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Tuple> criteriaQuery = criteriaBuilder.createQuery(Tuple.class);
Root<FourWheelerQuoteResponseEntity> root = criteriaQuery.from(FourWheelerQuoteResponseEntity.class);
criteriaQuery.groupBy(root.get("createdBy"));
if(order.equals("desc")) {
criteriaQuery.orderBy(criteriaBuilder.desc(criteriaBuilder.count(root)));
}
if(order.equals("asc")) {
criteriaQuery.orderBy(criteriaBuilder.asc(criteriaBuilder.count(root)));
}
criteriaQuery.multiselect(root.get("createdBy"), criteriaBuilder.count(root));
criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.in(root.get("createdBy")).value(userIdList)));
List<Tuple> resultList = entityManager.createQuery(criteriaQuery).setMaxResults(howMany).getResultList();
Map<String,Long> orderedMap = new LinkedHashMap<String,Long>();
for ( Tuple tuple : resultList ) {
String userId = (String) tuple.get( 0 );
Long count = (Long) tuple.get( 1 );
orderedMap.put(userId, count);
}
return orderedMap;
}
select CreatedBy, count(*) as cnt
from fourwheelerquoteresponse
group by CreatedBy
order by count(*) desc
limit 5;
这是我的 sql 我根据 JPA 标准想要它 API 仍然不确定 这是我的查询,它返回整个列表而不考虑组
@Override
public List<FourWheelerQuoteResponseEntity> findAllByTopOrLow(String createdBy) {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<FourWheelerQuoteResponseEntity> criteriaQuery = criteriaBuilder.createQuery(FourWheelerQuoteResponseEntity.class);
Root<FourWheelerQuoteResponseEntity> root = criteriaQuery.from(FourWheelerQuoteResponseEntity.class);
Expression<String> groupByExp = root.get("createdBy").as(String.class);
Expression<Long> countExp = criteriaBuilder.count(groupByExp);
CriteriaQuery<FourWheelerQuoteResponseEntity> select =
criteriaQuery.multiselect(groupByExp, countExp);
criteriaQuery.groupBy(groupByExp);
criteriaQuery.orderBy(criteriaBuilder.desc(countExp));
criteriaQuery.select(root)
.where(criteriaBuilder.equal(root.get("createdBy"), createdBy));
try {
return entityManager.createQuery(select).getResultList();
} catch (NoResultException nre) {
return null;
} catch (NonUniqueResultException nure) {
return null;
}
}
在 MySQL (?) 或 Hibernate 上表达查询的语法非常相似:
select entity.createdBy, count(entity)
from FourWheelerQuoteResponseEntity entity
group by entity.createdBy
order by count(entity) desc
limit 5
参考下面的代码,我相信这会解决你的问题。如果没有,请告诉我
@Override
@Transactional(readOnly = true)
public Map<String,Long> topOrLowFew(List<String> userIdList,String order,int howMany) {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Tuple> criteriaQuery = criteriaBuilder.createQuery(Tuple.class);
Root<FourWheelerQuoteResponseEntity> root = criteriaQuery.from(FourWheelerQuoteResponseEntity.class);
criteriaQuery.groupBy(root.get("createdBy"));
if(order.equals("desc")) {
criteriaQuery.orderBy(criteriaBuilder.desc(criteriaBuilder.count(root)));
}
if(order.equals("asc")) {
criteriaQuery.orderBy(criteriaBuilder.asc(criteriaBuilder.count(root)));
}
criteriaQuery.multiselect(root.get("createdBy"), criteriaBuilder.count(root));
criteriaQuery.where(criteriaBuilder.and(criteriaBuilder.in(root.get("createdBy")).value(userIdList)));
List<Tuple> resultList = entityManager.createQuery(criteriaQuery).setMaxResults(howMany).getResultList();
Map<String,Long> orderedMap = new LinkedHashMap<String,Long>();
for ( Tuple tuple : resultList ) {
String userId = (String) tuple.get( 0 );
Long count = (Long) tuple.get( 1 );
orderedMap.put(userId, count);
}
return orderedMap;
}