首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Spring Data JPA CriteriaQuery 分組查詢實戰:select、groupBy、having 完整用法

     編輯:程式設計綜合問答

常見誤區

直接在 CriteriaQuery.select() 設定欄位無效,因 JPA 預設回傳實體類型。分組查詢需明確構建 Tuple 或 DTO 投影。

正確實作範例

@Repository
public interface CountryRepository extends JpaRepository<Country, Long> {
    
    @Query("SELECT c.currency, SUM(c.population) FROM Country c " +
           "WHERE :continent MEMBER OF c.continents " +
           "GROUP BY c.currency HAVING COUNT(c) > 1")
    List<Object[]> findCurrencyPopulationSummary(@Param("continent") String continent);
}

CriteriaBuilder 動態查詢寫法

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Tuple> query = cb.createTupleQuery();
Root<Country> root = query.from(Country.class);

// 選欄位:currency + SUM(population)
query.multiselect(
    root.get("currency"),
    cb.sum(root.get("population")).alias("totalPop")
);

// 條件:Europe 在 continents 集合中
query.where(cb.isMember("Europe", root.get("continents")));

// 分組與過濾
query.groupBy(root.get("currency"));
query.having(cb.gt(cb.count(root), 1));

// 執行
List<Tuple> results = entityManager.createQuery(query).getResultList();
results.forEach(t -> 
    System.out.println(t.get("currency") + " : " + t.get("totalPop"))
);

關鍵 API 對照表

JPQLCriteria API說明
SELECT a, SUM(b)cb.sum(root.get("b"))聚合函數需透過 CriteriaBuilder
GROUP BY aquery.groupBy(root.get("a"))分組欄位必須出現在 select 中
HAVING COUNT > 1query.having(cb.gt(cb.count(root), 1))分組後過濾條件
WHERE x MEMBER OF ycb.isMember("x", root.get("y"))集合成員檢查

官方文件參考

ObjectDB JPA Criteria GROUP BY & HAVING 詳細文件

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved