Criteria API code that searches via associated Entity ID breaks does not work in Hibernate 5.4.1. while it still worked in Hibernate 5.2.18,
{code} DetachedCriteria criteria = DetachedCriteria.forClass(Foo.class); criteria.add(Restrictions.eq("bar.id", 1l)); criteria.getExecutableCriteria(s).list(); tx.commit(); {code}
{code} org.hibernate.QueryException: could not resolve property: bar.id of: org.hibernate.bugs.Foo at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:73) at org.hibernate.persister.entity.AbstractPropertyMapping.toColumns(AbstractPropertyMapping.java:88) at org.hibernate.persister.entity.BasicEntityPropertyMapping.toColumns(BasicEntityPropertyMapping.java:43) at org.hibernate.persister.entity.AbstractEntityPersister.toColumns(AbstractEntityPersister.java:1953) at org.hibernate.loader.criteria.CriteriaQueryTranslator.getColumns(CriteriaQueryTranslator.java:534) at org.hibernate.loader.criteria.CriteriaQueryTranslator.findColumns(CriteriaQueryTranslator.java:549) at org.hibernate.criterion.SimpleExpression.toSqlString(SimpleExpression.java:66) at org.hibernate.loader.criteria.CriteriaQueryTranslator.getWhereCondition(CriteriaQueryTranslator.java:424) at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:106) at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:75) at org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:80) at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1985) at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:370) at org.hibernate.bugs.CriteriaAssociationTest.optionalTest(CriteriaAssociationTest.java:65) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.hibernate.testing.junit4.ExtendedFrameworkMethod.invokeExplosively(ExtendedFrameworkMethod.java:45) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) at org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:298) at org.junit.internal.runners.statements.FailOnTimeout$CallableStatement.call(FailOnTimeout.java:292) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.lang.Thread.run(Thread.java:748) {code}
This happens if the association is an optional OneToOne mapped with PrimaryKeyJoinColumn. If the association is mapped optional=false the query still works.
The cause seem to be the commit https://github.com/hibernate/hibernate-orm/commit/2bfe30009c15ea59c587d11714d4be78b14f9ad9 and the partial revert in https://github.com/hibernate/hibernate-orm/commit/8535adc05736e9ae93d818d9aff25bf9255a1bbd
The attached test case works with 5.2.18, but fails no optional associations in 5.4.1. |
|