2014-09-01 136 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

相关问题