2016-05-12 12 views

Antwort

0

Sie einen DetachedCriteria schreiben können Sie eine Liste von score_id, max(version_no) Paare zu bekommen und Machen Sie eine Multi-Eigenschaft IN() mit Ihrer äußeren Criteria.

DetachedCriteria subQuery = DetachedCriteria.forClass(ScoreVersion.class); 
subQuery.setProjection(
     Projections.projectionList() 
     .add(Projections.groupProperty("scoreId")) 
     .add(Projections.max("versionNumber") 
    ) 
); 

Criteria criteria = this.getSession().createCriteria(ScoreVersion.class); 
criteria.add(
    Subqueries.propertiesIn(new String[] {"scoreId", "versionNumber"}, subQuery) 
); 

Die resultierende SQL unter der Decke sollte wie folgt aussehen:

select * from [ScoreVersion] where ([score_id], [Version_No]) in (
    select [score_id], max([Version_No]) from [ScoreVersion] group by [score_id] 
); 

Vor 4 bis Hibernate:

Sie haben würde die Abfrage in HQL schreiben:

Query query = session.createQuery(String sql); 

Hier ist Ihre Abfrage:

select sv from ScoreVersion sv 
where (sv.scoreId, sv.versionNumber) in (
    select sub.scoreId, max(sub.versionNumber) 
    from ScoreVersion sub 
    group by sub.scoreId 
) 
+0

Dean Clark, ich benutze Hibernate 3.jar, Unterabfragen.propertiesIn Methode nicht in dieser Version Born. –

+0

Es wurde mit Hibernate 4 (https://hibernate.atlassian.net/browse/HHH-6766) hinzugefügt. Wenn Sie upgraden können, großartig ... sonst müssen Sie die Abfrage in HQL schreiben –

Verwandte Themen