I am migrating the project from Hibernate 5 to 6. Given the entities defined like this
@Entity
@Table(name = "person")
public class Person extends Basic {
@OneToOne
@JoinColumn(name = "person_house_objectId", foreignKey = @ForeignKey(name = "fk_person_house_objectId"))
private House house;
}
@Entity
@Table(name = "house")
public class House extends Basic {
}
There are multiple places in the project having join HQL queries like this
entityManagerFactory.createEntityManager().createQuery("select c from Person c join House s where c.id = '123123' ").getResultList()
where there is no ON clause specified. It worked with Hibernate 5.x but in version 6.1.0 Final, it generated this SQL query
select
p1_0.objectId,
p1_0.person_house_objectId,
p1_0.person_land_objectId,
p1_0.name
from
person p1_0
join
house h1_0
on true
where
p1_0.objectId='123123'
I expect that there is an ON clause generated for this query.
when I tried with version 6.6.37.Final, I got the error:
Caused by: org.hibernate.query.SemanticException: Entity join did not specify a join condition [SqmEntityJoin(org.hibernate.bugs.pojo2.House(s))] (specify a join condition with 'on' or use 'cross join')
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.consumeEntityJoin(BaseSqmToSqlAstConverter.java:3552)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.consumeExplicitJoin(BaseSqmToSqlAstConverter.java:3298)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.consumeJoins(BaseSqmToSqlAstConverter.java:2907)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.consumeFromClauseRoot(BaseSqmToSqlAstConverter.java:2841)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1597)
at org.hibernate.query.sqm.tree.from.SqmFromClause.visitRoots(SqmFromClause.java:81)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitFromClause(BaseSqmToSqlAstConverter.java:2584)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitQuerySpec(BaseSqmToSqlAstConverter.java:2090)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitQuerySpec(BaseSqmToSqlAstConverter.java:454)
at org.hibernate.query.sqm.tree.select.SqmQuerySpec.accept(SqmQuerySpec.java:124)
at org.hibernate.query.sqm.spi.BaseSemanticQueryWalker.visitQueryPart(BaseSemanticQueryWalker.java:245)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitQueryPart(BaseSqmToSqlAstConverter.java:1946)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitSelectStatement(BaseSqmToSqlAstConverter.java:1629)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitSelectStatement(BaseSqmToSqlAstConverter.java:454)
at org.hibernate.query.sqm.tree.select.SqmSelectStatement.accept(SqmSelectStatement.java:238)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.translate(BaseSqmToSqlAstConverter.java:800)
at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.buildCacheableSqmInterpretation(ConcreteSqmSelectQueryPlan.java:479)
at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.withCacheableSqmInterpretation(ConcreteSqmSelectQueryPlan.java:385)
at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.performList(ConcreteSqmSelectQueryPlan.java:359)
at org.hibernate.query.sqm.internal.QuerySqmImpl.doList(QuerySqmImpl.java:380)
at org.hibernate.query.spi.AbstractSelectionQuery.list(AbstractSelectionQuery.java:143)
I did not find it mention that HQL does require specifying ON clause for associated entities. Or my entity configuration is wrong?