2014-09-01 137 views
3

我使用JpaSpecificationExecutor,JPA 2.0,Hibernate和MSSQL,並希望建立與CriteriaBuilder以下查詢:如何根據JPA和JpaSpecificationExecutor的結果進行分組?

SELECT CURR_DATE, MAX(POSITION) FROM TOP_COMPONENT_HISTORY GROUP BY CURR_DATE 

我的問題:可能嗎?如果,如何?

謝謝你圍繞這個包裝!

這是我的代碼..

表(TOP_COMPONENT_HISTORY)

1 ARC_ID varchar NO   
2 CURR_DATE varchar NO   
3 REG_DATE datetime2 YES   7 
4 APPLY_DATE datetime2 YES   7 
5 POSITION int YES 10 0 
6 REG_USER_ID varchar NO   
7 MOD_USER_ID varchar NO 

服務

public Page<TopComponentHistory> findByCurrDate(ArticleSearchForm searchForm){ 
     return topComponentHistoryRepository.findAll(TopComponentHistory.findAllGroupBy(),constructPageSpecification(searchForm.getPageNum()); 
    } 

public class TopComponentHistory implements Serializable { 
    public static Specification<TopComponentHistory> findAllGroupBy() {  
     How can i make query... 
     return .. 
    } 
} 

public interface TopComponentHistoryRepository extends JpaRepository<TopComponentHistory, String>, JpaSpecificationExecutor<TopComponentHistory> { 


} 
+0

我很難把你的初始查詢包裹起來。它缺少一個'FROM'子句,我不確定你想如何處理'TITLE'? – mabi 2014-09-01 12:45:24

+0

更新後的查詢無效。它解決了'FROM'問題,但您仍然無法選擇不在'GROUP BY'子句中的原始列。你能描述一下你實際想要達到的目標嗎? – mabi 2014-09-02 08:45:16

+0

我想按結果分組,使用JPA和JpaSpecificationExecutor。 – 2014-09-02 10:14:32

回答

2
public static Specification<TopComponentHistory> findAllGroupBy() { 
     return new Specification<CompPlanID>(){ 
      @Override 
      public Predicate toPredicate(Root<TopComponentHistory> root, CriteriaQuery<?> query, CriteriaBuilder cb) { 
    query.groupBy(column_name); 
    } 
    } 
+0

解釋會很好 – Aziz 2016-02-09 16:56:51

+0

JpaSpecificationExecutor有方法 列表 findAll(規範規範);我們可以在此給出規範作爲參數。 通過覆蓋toPredicate(Root,CriteriaQuery,CriteriaBuilder)方法可以創建規範。我們可以創建任意數量的Predicates,併爲GROUP BY子句使用query.grouBy()。 – Deepak 2016-02-09 17:57:23

+1

我花了一些時間來弄清楚如何找到正確的方式來定義組中的列名。所以在Deepak示例中替換query.groupBy(column_name);通過query.groupBy(root.get(TopComponentHistory_.YOUR_COLUMN)); – 2017-09-13 13:29:11

相關問題