OpenJPA: как построить запрос GROUP BY с подсчетом групп

В 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: ваш запрос по типу «класс com.su3analytics.sitedelta.model.PageDeltaSummary» с фильтром «выберите d, count (d) из PageDeltaSummary d, где d.deltaHistoryId = :deltaHistoryId и d.type = :pageDeltaType GROUP BY d.fingerprint" недействителен. Ваши предложения выбора и наличия должны включать только агрегаты или значения, которые также появляются в вашем предложении группировки.

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

Какие-либо предложения?

Спасибо


person Richard H    schedule 23.11.2010    source источник


Ответы (1)


Ваш исходный 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

Эти запросы возвращают пары ‹fingerprint, finger_count> вместо полных page_delta_summary строк (или сущностей).

person axtavt    schedule 23.11.2010
comment
Спасибо за ответ. но почему мой оригинальный sql не имеет смысла? Я могу выполнить его напрямую без проблем. - person Richard H; 23.11.2010
comment
@Richard: мне интересно, какая база данных поддерживает это. Обычно предложение SELECT может использовать только те же поля, что и в предложении GROUP BY, или агрегатные функции для других полей. - person axtavt; 23.11.2010
comment
Я использую MySQL, так интересно, что он поддерживается - person Richard H; 23.11.2010