[英]Dynamic JPA criteria builder
我正在使用 Spring 啟動 JPA 到下面執行下面的查詢
select DELTA_TYPE,OPERATION_ID,COUNT(*) from ACTIVE_DISCREPANCIES ad group by DELTA_TYPE,OPERATION_ID
DELTA_TYPE、OPERATION_ID 等可能來自外部系統,在存儲庫 class 中我嘗試執行本機查詢
@Query(value="select OPERATION_ID,DELTA_TYPE,count(*) from ACTIVE_DISCREPANCIES ad group by ?1",nativeQuery = true)
public List<Object[]> groupByQuery(@Param("reconType") String recGroupColumns);
其中 recGroupColumns="DELTA_TYPE,OPERATION_ID" 但沒有工作,因為@param 將拆分','
我的第二個選擇是標准查詢
public List<Object[]> getReconGroupList() {
String recGroupColumns = "OPERATION_ID,DELTA_TYPE";
String[] arrStr = recGroupColumns.split(",");
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Object[]> query = criteriaBuilder.createQuery(Object[].class);
Root<ActiveDiscrepancies> adr = query.from(ActiveDiscrepancies.class);
query.groupBy(adr.get("operationId"), adr.get("deltaType"));
// query.groupBy(adr.get("deltaType"));
query.multiselect(adr.get("operationId"), adr.get("deltaType"), criteriaBuilder.count(adr));
TypedQuery<Object[]> typedQuery = entityManager.createQuery(query);
List<Object[]> resultList = typedQuery.getResultList();
return resultList;
}
在這里如何動態傳遞 groupBy 和多選?
使用投影我們可以解決這種情況,下面是代碼
Criteria criteria = getSession().createCriteria(ActiveDiscrepancies.class);
ProjectionList projectionList = Projections.projectionList();
for(String str : colList) {
projectionList.add(Projections.groupProperty(str));
}
projectionList.add(Projections.rowCount());
criteria.setProjection(projectionList);
List results = criteria.list();
getSession().close();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.