繁体   English   中英

休眠,处理条件和左外部联接条件

[英]Hibernate, dealing with Criteria and left outer join condition

我已有一段类似的代码:

Criteria crit = session.createCriteria(myClass);
crit.createAlias(TAB1, TAB1, JoinType.LEFT_OUTER_JOIN);
crit.createAlias(TAB1 + ".table2", TAB2, JoinType.LEFT_OUTER_JOIN);
crit.add(Restrictions.eq(TAB1 + ".deleted", Boolean.FALSE));
crit.add(Restrictions.eq(TAB2 + ".id", someId));

这将“生成”一个SQL查询,如下所示:

SELECT * FROM myClass this_
LEFT OUTER JOIN TAB1 tab1_ ON this_.id=tab1_.myClass_id
LEFT OUTER JOIN TAB2 tab2_ ON tab1_.tab2_id=tab2_.id
WHERE tab1_.deleted=0
AND tab2_.id = 1234

我需要将过滤器置于JOIN条件而不是WHERE子句中。

为了清楚起见,我需要以下查询:

SELECT * FROM myClass this_
LEFT OUTER JOIN TAB1 tab1_ ON this_.id=tab1_.myClass_id AND tab1_.deleted=0
LEFT OUTER JOIN TAB2 tab2_ ON tab1_.tab2_id=tab2_.id AND AND tab2_.id = 1234

我怎样才能做到这一点?

谢谢

您正在使用:

crit.createAlias(${table}, ${alias}, ${joinType});

您应该可以使用:

crit.createAlias(${table}, ${alias}, ${joinType}, ${Criterion});

尽管在我们的代码库中找不到一个示例,但我希望它能起作用。

这是Hibernates合流页面上的一个不错的示例:

public class PersonDao extends HibernateDaoSupport {
   public List<Person> findByName() { 
      Criteria criteria = getSession().createCriteria(Person.class, "p");
      criteria.createCriteria("p.names", "names", JoinType.INNER_JOIN, Restrictions.eq("name", "John")); 
      return criteria.list(); 
   }
}

产生

select this_.id as y0_ from person this_ 
inner join debtor_info this_1_ on this_.id=this_1_.id 
left outer join person_person_name personname3_ on this_.id=personname3_.person_id and ( name1_.name=? ) 
left outer join person_name name1_ on personname3_.person_name_id=name1_.id and ( name1_.name=? )

通过该示例,我相信您的代码应类似于

Criteria crit = session.createCriteria(MyClass.class, "mine");
crit.createAlias("mine.names", "name", JoinType.LEFT_OUTER_JOIN, Restrictions.eq("name", Boolean.FALSE));
crit.createAlias("q.id", "id", JoinType.LEFT_OUTER_JOIN, Restrictions.eq("id", someId));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM