2011-05-24 20 views
8

Bir kayıt grubundan en son tarihin bulunduğu bir kaydı bulmak için sorgulamam gerekir. Böyle En son olarak bir şey ile, şeyler bir grup denedim:JPQL Sorgulama bir tarih alanında maks kullanarak

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

Maalesef ben denedim her şey hata çeşit vermiştir. Ben en iyi şekilde görünmek hatadır:

 
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 

ne bu beni anlatıyor Ben grup çalışmasını sağlamak için benim seçme fıkrada uygun şeyler yok olduğuna inanıyoruz. Ancak, her türlü kombinasyonu denedim ve her şey bu hatayı geri götürüyor.

Birisi bana burada yanlış yaptığımı bir ipucu verebilir mi?

cevap

9

Eh ben moderatör cevabı taşındı okumak düzenlemek rahatsız etmedi tahmin:

"Ben veri elemanlarının listesini conains bir tablo var (id: Sorgunun niyet üzerine sorgulayıcı gelen yorumunu ., mesaj (string), siteid (string), CreatedDate (Zaman damgası) ne yapmam gerekir siteid tarafından seçme, sonra en son CreatedDate ile o gruptaki kayıt bulmak "

Çözüm:.

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) aslında J'de nasıl çalışır? PA? Veritabanına yalnızca bir satır döndürmesi talimatı veriyor mu, yoksa sorguya göre tüm satırları veritabanından alıyor ve sonra yalnızca bir satır döndürüyor mu? – Wudong

+1

tam olarak setMaxResults (1) çalışmasının, JPA uygulamasına ve jdbc sürücü özelliklerine bağlı olması. MS-SQL üzerinde OpenJPA'da bu, temel SQL sorgusunda SELECT TOP 1'e çevrilir. – Armand