2014-09-01 1 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 .. 
    } 
} 

Repository

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


} 
+0

У меня есть трудное время оборачивать свой ум вокруг вашего первоначального запроса. В нем отсутствует предложение 'FROM', и я не уверен, как вы хотите обрабатывать' TITLE'? – mabi

+0

Обновленный запрос недействителен. Он обращается к проблеме «FROM», но вы по-прежнему не можете выбрать необработанный столбец, который не находится в вашем предложении GROUP BY. Можете ли вы описать, чего вы на самом деле хотите достичь? – mabi

+0

Я хочу сгруппировать по результату, используя JPA и JpaSpecificationExecutor. –

ответ

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

+0

JpaSpecificationExecutor имеет метод Список findAll (спецификация spec); где мы можем указать Спецификацию в качестве параметра. Спецификация может быть создана путем переопределения метода toPredicate (Root, CriteriaQuery, CriteriaBuilder). Мы можем создать любое количество предикатов и использовать query.grouBy() для предложения GROUP BY. – Deepak

+1

Мне потребовалось некоторое время, чтобы выяснить, как найти правильный способ определения имени столбца в группе. поэтому в примере Дипака замените query.groupBy (column_name); по запросу.groupBy (root.get (TopComponentHistory_.YOUR_COLUMN)); –