I'm using Hibernate 3.6 and MSSQL 2012.
When executing this 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'
I'm getting this 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'
*Notice the cross join and the added condition in the where clause.
According to Hibernate docs https://docs.jboss.org/hibernate/core/3.5/reference/en/html/queryhql.html#queryhql-joins-forms
implicit join should generate to inner join.
I've noticed that there is an open bug https://hibernate.atlassian.net/browse/HHH-7707 that may be referring to this problem but no one answered and it's opened for a year already.
I would appreciate any information about this issue. Thank you.
PS. I'm well aware that using implicit joins is not the right way of writing HQL but I can't do anything about this right now.
Your join is an inner join, but using the old syntax consisting in adding a condition in the where clause:
where property0_.refEntityid=entity1_.id
instead of doing it with
inner join Entities entity1_ on property0_.refEntityid=entity1_.id
The result is exactly the same.
And using implicit joins in HQL is not a problem at all, as long as you understand what they're doing.
When using HQL, always use proper aliases when performing join operations.Your query should be something like that:
select tbl.state
from Property tbl
left join tbl.entity entity
where tbl.state = 1
and entity.state = 1
and entity.className = 'com....'
and tbl.fieldName = 'fieldName'
Otherwise if you try to use tbl.entity.someProperty
, in HQL, it will always create a crossJoin
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With