2010-02-05 38 views
21

我想使用Criteria API在两个表之间执行左外连接。所有我能找到在Hibernate文档中是这样的方法:(懒惰)使用Hibernate Criteria API的左外连接

Criteria criteria = this.crudService 
      .initializeCriteria(Applicant.class) 
      .setFetchMode("products", FetchMode.JOIN) 
      .createAlias("products", "product"); 

然而,这无论是进行内连接或右外连接,因为它返回结果的数量。

我也希望我的加入是懒惰的。我怎样才能做到这一点?

干杯!

UPDATE:似乎使用别名会自动连接INNER JOIN。在我还没有掌握的“背景故事”中有一些东西。所以,今天没有别名。这给我留下了对两个表应用限制的问题,因为它们都有一个列(或属性,如果这更合适)'名称'。

+2

接受答案了。 – 2013-04-30 21:05:18

+0

我想知道你在Hibernate中的createAlia()的引用默认情况下创建一个INNER JOIN“。我搜索了API,看不到它。谢谢。 – FaithReaper 2016-03-11 11:33:34

回答

0

连接处于SQL请求中。它不能懒惰。


用Hibernate,为了检索懒惰的数据,只需从HQL请求中排除它。然后,当你访问实体上的getters(如果你的Session仍然打开),它将自动加载(你不必写这部分请求)。

+0

对不起,我没有得到这个。也许我应该改写一下:我想有一个左外连接,但我也希望只有在需要时才会检索数据(适当的getter被调用)。懒惰(或急切)以某种方式与发生的SQL JOIN类型相关联? – 2010-02-05 11:25:46

+0

懒惰可以用对象来实现,但不能用SQL请求来实现。一个请求被完全执行一次,它的设计并非如此,以便稍后在需要的时候执行部分请求! – KLE 2010-02-05 11:35:14

+0

在HQL中我写了LEFT OUTER JOIN FETCH。所以,大概一个HQL查询对应于许多SQL,在需要时执行?无论如何,懒惰与否,我如何做一个左外连接?而不是在HQL中,使用Criteria API。干杯! – 2010-02-05 11:42:27

34

如果需要左连接产品表只是做:

..... createAlias( “产品”, “产品”,Criteria.LEFT_JOIN);

+0

真的很简单和有益的,非常感谢! – Sllouyssgort 2014-12-19 10:39:32

+1

现在不赞成使用Ankit的答案 – jlars62 2015-09-02 23:07:21

20

Sdavids答案的API现在是deprecated。它的更新版本

.... createAlias( “雇员”, “EMP”,JoinType.LEFT_OUTER_JOIN)

+0

谢谢。它可以帮助我消除不推荐使用的API – 2015-03-03 08:33:09