小编典典

HQL隐式联接在where子句中生成交叉联接,而不是内部联接

hibernate

我正在使用Hibernate 3.6和MSSQL 2012。

执行此HQL时

select tbl.state from Property tbl where tbl.state = 1 and tbl.entity.state = 1 and
tbl.entity.className = 'com....' and tbl.fieldName = 'fieldName'

我正在获取此SQL

select property0_.State as col_0_0_ from Properties property0_ cross join Entities
entity1_ where property0_.refEntityid=entity1_.id and property0_.State=1 and
entity1_.State=1 and entity1_.ClassName='com....' and property0_.FieldName='fieldName'

请注意 交叉连接 和where子句中的 附加条件* 。

根据Hibernate docs
https://docs.jboss.org/hibernate/core/3.5/reference/en/html/queryhql.html#queryhql-
joins-
forms

隐式连接应该生成为 内部连接

我注意到有一个打开的错误https://hibernate.atlassian.net/browse/HHH-7707,可能是指此问题,但没有人回答,并且已经开放了一年。

我将不胜感激有关此问题的任何信息。谢谢。

PS。我很清楚,使用隐式联接不是编写HQL的正确方法,但是我现在对此无能为力。


阅读 265

收藏
2020-06-20

共1个答案

小编典典

您的联接是内部联接,但是使用的旧语法包括在where子句中添加条件:

where property0_.refEntityid=entity1_.id

而不是用

inner join Entities entity1_ on property0_.refEntityid=entity1_.id

结果是完全一样的。

只要您了解它们的作用,在HQL中使用隐式联接根本不是问题。

2020-06-20