OpenJPA: как построить запрос GROUP BY с количеством групп - PullRequest
0 голосов
/ 23 ноября 2010

В JPQL я хочу построить эквивалентный запрос к этому:

select *, count(*) as finger_count from page_delta_summary 
where delta_history_id = ? and change_type = ? group by fingerprint;

, где fingerprint - это поле varchar в таблице page_delta_summary.Вот что у меня есть:

select d, count(d) as finger_count from PageDeltaSummary d 
where d.deltaHistoryId = :deltaHistoryId and d.type = :pageDeltaType 
GROUP BY d.fingerprint"

, где PageDeltaSummary - моя сущность.Но я получаю следующее исключение:

org.apache.openjpa.persistence.ArgumentException: Ваш запрос на тип "class com.su3analytics.sitedelta.model.PageDeltaSummary" с фильтром "выберите d, count (d) из PageDeltaSummary d, где d.deltaHistoryId =: deltaHistoryId и d.type =: pageDeltaType GROUP BY d.fingerprint "недопустимы. Ваши предложения select и Имеющие должны включать только агрегаты или значения, которые также появляются в вашем предложении группировки.

Запрос работает нормально, если я уберу count (d) в качестве finger_count или GROUP BY.

Есть предложения?

Спасибо

1 Ответ

2 голосов
/ 23 ноября 2010

Ваш исходный запрос SQL не имеет смысла, поэтому вы не можете преобразовать его в JPQL.

Полагаю, вы хотите получить количество page_delta_summary строк, удовлетворяющих условиям where для каждого fingerprint.Если это так, SQL-запрос выглядит так:

select fingerprint, count(*) as finger_count from page_delta_summary  
where delta_history_id = ? and change_type = ? group by fingerprint;

и JPQL - вот так:

select d.fingerprint, count(d) from PageDeltaSummary d    
where d.deltaHistoryId = :deltaHistoryId and d.type = :pageDeltaType    
GROUP BY d.fingerprint

Эти запросы возвращают пары <<code>fingerprint, finger_count> вместо полныхpage_delta_summary строк (или объектов).

...