Запрос JPQL с использованием max в поле даты

Мне нужно запросить, чтобы найти запись с самой последней датой из группы записей. Я пробовал кучу вещей, самая последняя из которых была примерно такой:

select msg, msg.createdDate from ImportedMessage msg where msg.siteId = ?1 and msg.createdDate = max(msg.createdDate) group by msg.createdDate

К сожалению, все, что я пробовал, приводило к какой-то ошибке. Ошибка, которую я, кажется, получаю больше всего:

Caused by: java.sql.SQLException: Not in aggregate function or group by clause: 
org.hsqldb.Expression@688c688c in statement [select importedme0_.IMPORTED_MSG_ID as 
col_0_0_, importedme0_.CREATED_DATE as col_1_0_, max(importedme0_.CREATED_DATE) as 
col_2_0_, importedme0_.IMPORTED_MSG_ID as IMPORTED1_1_, importedme0_.CREATED_BY as
CREATED2_1_, importedme0_.CREATED_DATE as CREATED3_1_, importedme0_.UPDATED_BY as
UPDATED4_1_, importedme0_.UPDATED_DATE as UPDATED5_1_, importedme0_.IMPORT_TYPE as
IMPORT6_1_, importedme0_.MESSAGE as MESSAGE1_, importedme0_.PROCESSED_FLAG as
PROCESSED8_1_, importedme0_.SITE_ID as SITE9_1_ from IMPORTED_MSG importedme0_ where
importedme0_.SITE_ID=? and importedme0_.CREATED_DATE=max(importedme0_.CREATED_DATE) 
group by importedme0_.CREATED_DATE]
    at org.hsqldb.jdbc.Util.throwError(Unknown Source)
    at org.hsqldb.jdbc.jdbcPreparedStatement.(Unknown Source)
    at org.hsqldb.jdbc.jdbcConnection.prepareStatement(Unknown Source)
    at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:534)
    at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:452)
    at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:161)
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1616)
    at org.hibernate.loader.Loader.doQuery(Loader.java:717)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:270)
    at org.hibernate.loader.Loader.doList(Loader.java:2449)
    ... 52 more

Я считаю, что это говорит мне о том, что у меня нет подходящих вещей в моем предложении select, чтобы позволить группе работать. Однако я пробовал всевозможные комбинации, и все приводит к этой ошибке.

Может кто-нибудь дать мне понять, что я делаю неправильно здесь?


person Steve    schedule 24.05.2011    source источник


Ответы (2)


Ну, я думаю, модератор не удосужился прочитать редактирование, которое переместило ответ вверх: комментарий спрашивающего о намерении запроса:

«У меня есть таблица, содержащая список элементов данных (идентификатор, сообщение (строка), siteId (строка), createdDate (отметка времени). Что мне нужно сделать, это выбрать по siteId, а затем найти запись в этой группе с дата последнего создания."

Решение:

Query query = entityManagerReference.createQuery(
"SELECT msg FROM ImportedMessage msg " 
+ "WHERE msg.siteId = :siteId ORDER BY msg.createDate desc");

query.setParameter("siteId", 12345);
query.setMaxResults(1);
person user767683    schedule 24.05.2011
comment
Как setMaxResults(1) на самом деле работает в JPA? Указывает ли он базе данных возвращать только одну строку или получать все строки из базы данных в соответствии с запросом, а затем возвращать только одну строку? - person Wudong; 12.02.2014
comment
то, как именно работает setMaxResults(1), зависит от реализации JPA и возможностей драйвера jdbc. В OpenJPA на MS-SQL это преобразуется в SELECT TOP 1 в базовом SQL-запросе. - person Armand; 10.12.2014

Спящий режим с использованием диалекта Oracle10 преобразует это в WHERE ROWNUM ‹= 1.

person Marcelo Carvalho    schedule 14.08.2019