перевод TypedQuery в критерийQuery (JPA 2.0) с максимальным, минимальным, групповым и упорядоченным по - PullRequest
2 голосов
/ 04 октября 2011

У меня есть некоторые трудности в переводе хорошо работающего typedQuery в критерии JPA 2.0. Query: /

Следуя моему рабочему типизированному Query:

String name = "Station1";

Query qry = em.createQuery("
select YEAR(s.fetchDate), MAX(s.actExport)-MIN(s.actExport), MIN(s.actExport), MAX(s.actExport) 
from StationItem s 
where s.fetchDate >= '2008' and s.fetchDate < '2012' 
    and s.errorState=0
    and s.actExport>0
    and s.name = :name        
group by YEAR(s.fetchDate)
order by s.fetchDate ");

qry.setParameter("name", name);

Теперь основная проблема для меня - группировать по годамdate) [date имеет формат ГГГГ-ММ-ДД чч: ММ] и для записи выражений Max и Min.Я начал так:

Date endTime = new Date();
Date startTime = DateUtil.yearsInPast(5,endTime); //own helper class

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Tuple> cq = cb.createTupleQuery();
Root<StationItem> r = cq.from(StationItem.class);

// setting predicates (used in where clause)
Predicate pStation = cb.equal(r.get("name"), station);
Predicate pError = cb.equal(r.get("errorState"), 0);
Predicate pTime = cb.between(r.get("fetchDate").as(Date.class), startTime, endTime);
Predicate pNotNull = cb.notEqual(r.get(selection), 0);

// setting expressions (used in select clause)
Expression<Number> select = r.get(selection);
Expression<Number> maximum = cb.max(select);
Expression<Number> minimum = cb.min(select);
Expression<Date> fetchDate = r.get("fetchDate").as(Date.class);

// building my query (select, where, group by, order by)
cq.multiselect(fetchDate, select, maximum, minimum); //fetchDate needs to be shrinked to only the Year! and Max-Min would be nice (but this can be done when writing the data to an object/list)
cq.where(pStation, pTime, pError, pNotNull);
cq.groupBy(fetchDate); //grouping should be done by the year of the fetchDate
cq.orderBy(cb.asc(fetchDate));

// write results to a list
List<Tuple> l = em.createQuery(cq).getResultList();

на данный момент значения Max и Min одинаковы ... но это вполне логично, потому что нет группировки по году для fetchDate ... Как я могудостигнуть группировки только по году моей даты и как будет выглядеть расчет max-min?

заранее спасибоРон.

1 Ответ

4 голосов
/ 06 сентября 2012

Вы можете использовать API Критерии, чтобы вызвать функцию в базовых БД, например, ГОД или МЕСЯЦ.Вот пример:

builder.function("YEAR", Integer.class, r.get("fetchDate"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...