2016-05-12 29 views

回答

0

你可以写一个DetachedCriteria让你的score_id, max(version_no)对的列表和与您的外部Criteria做一个多属性IN()

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

盖下产生的SQL应该是这个样子:

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

此前休眠4:

你不得不编写查询在HQL:

Query query = session.createQuery(String sql); 

其中您的查询是:

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,我使用hibernate 3.jar,Subqueries.propertiesIn方法没有在这个版本中获得。 –

+0

它被添加了Hibernate 4(https://hibernate.atlassian.net/browse/HHH-6766)。如果你可以升级,很好......否则你需要在HQL中编写查询 –