2011-05-24 47 views
8

我需要查詢才能從一組記錄中查找包含最近日期的記錄。我已經嘗試了一堆東西,與最近的是這樣的:在日期字段上使用max的JPQL查詢

 
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: 
[email protected] 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子句允許組的工作。但是,我嘗試了各種組合,並且所有事情都會導致出現此錯誤。

有人可以給我一個線索我在做什麼錯在這裏?

回答

9

嗯,我想主持人沒有理會讀取移動的回答了編輯:

「我有conains數據元素列表的表(ID:從提問者的查詢意圖 評論,消息(串),網站ID(字符串),createdDate(時間戳)什麼我需要做的是通過網站ID選擇,然後找到該組中的記錄與最近createdDate「

解決方案:

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); 
+1

setMaxResults(1)如何在J中實際工作PA?它指示數據庫只返回一行,還是根據查詢獲取數據庫中的所有行,然後只返回一行? – Wudong 2014-02-12 15:21:57

+1

setMaxResults(1)的工作方式取決於JPA實現和jdbc驅動程序的功能。在MS-SQL上的OpenJPA中,這轉換爲底層SQL查詢中的SELECT TOP 1。 – Armand 2014-12-10 01:33:09