具有主查询id的Hibernate Restrictions子查询

时间:2017-01-26 14:09:57

标签: java hibernate

我有2个数据表

Main
---
id          // 1

Second
---
id             //1; 2     
property       //"a"; "b"
creationDate(DD/MM/YYYY)   //01/01/2000; 02/02/2002
mainId         // 1; 1

连接是1- * 所以,我想要做的是通过“Second”中的属性查询我的“Main”表,但我想只搜索最新的属性。 因此,搜索“a”不得给出任何结果,因为“b”是更新的数据。

我通过SQL来做它,它看起来像这样:

select distinct m.id from Main m join Second s on m.id = s.mainId where s.property = 'b' and s.creationDate = (SELECT MAX(s2.creationDate) from Second s2 where s2.mainId = m.id);

我想出了一些java代码,但我不知道如何通过限制使用这个s2.mainId = m.id部分:

  DetachedCriteria d = DetachedCriteria.forClass(Second.class, "s1");
  ProjectionList proj = Projections.projectionList();
  proj.add(Projections.max("s1.creationDate"));
  d.setProjection(proj).add(Restrictions.eq("WHAT COMES HERE");

或者我应该使用不同的方法? 不幸的是我需要使用Hibernate Criterion Interface,因为整个seach机制是通过Criterion编写的。

1 个答案:

答案 0 :(得分:1)

    DetachedCriteria innerCrit = DetachedCriteria.forClass(Second.class);
    innerCrit.setProjection(Projections.max("creationDate");
    innerCrit.add(Restrictions.eqProperty("id", "main.id"));

    DetachedCriteriaouterCrit outerCrit = DetachedCriteria.forClass(Main.class, "main");
    outerCrit.createAlias("second", "second");
    outerCrit.add(Subqueries.eq(second.creationDate, innerCrit)); 
    outerCrit.add(Restrictions.eq("second.property", "b"));

这个outerCrit将为您提供主要对象。