Before Version 6.2 it was possible to just write the primary key (mostly a {{long}}) of the type referenced in CriteriaBuilder's {{equal}}, {{in}}, ...-Methods.
Since Version 6.2 this no longer works. This is mentioned in the [https://docs.jboss.org/hibernate/orm/6.2/migration-guide/migration-guide.html#query-path-comparison|https://docs.jboss.org/hibernate/orm/6.2/migration-guide/migration-guide.html#query-path-comparison|smart-link] however I assume that the Primary Keys have been overlooked.
e.g. the following Code fails
{code:java}... final CriteriaBuilder cb = this.getEntityManager().getCriteriaBuilder(); final CriteriaQuery<UserAuthLog> cq = cb.createQuery(UserAuthLog.class); final Root<UserAuthLog> root = cq.from(UserAuthLog.class); cq.select(root); // Problem here cq.where(cb.equal(root.get(UserAuthLog_.user), userId)); ...{code}
where the class {{UserAuthLog}} looks like this:
{noformat} ... @NotNull @ManyToOne(fetch = FetchType.EAGER) @JoinColumn( name = "user_id", foreignKey = @jakarta.persistence.ForeignKey(value = ConstraintMode.CONSTRAINT) ) private UserDetail user; ...{noformat}
and {{UserDetail}} like this
{ noformat code:java }public class UserDetail { ... @Id @GeneratedValue(strategy = IDENTITY) @Column(name = "id", unique = true, nullable = false) private long id; ...{ noformat code }
with the following exception
{ noformat code:java }Caused by: java.lang.IllegalArgumentException: Can't compare test expression of type [UserDetail] with element of type [basicType@1228(java.lang.Long,-5)] at org.hibernate.query.sqm.internal.SqmCriteriaNodeBuilder.assertComparable(SqmCriteriaNodeBuilder.java:2098) at org.hibernate.query.sqm.internal.SqmCriteriaNodeBuilder.equal(SqmCriteriaNodeBuilder.java:2121) at org.hibernate.query.sqm.internal.SqmCriteriaNodeBuilder.equal(SqmCriteriaNodeBuilder.java:182) at XXX.getUserLoginLogs(XXX.java:39) ...{ noformat code }
Also consider that some methods like {{in}} use collections with primary keys.
The changes were done here: [https://github.com/hibernate/hibernate-orm/pull/6189|https://github.com/hibernate/hibernate-orm/pull/6189] / [https://hibernate.atlassian.net/browse/HHH-15802|https://hibernate.atlassian.net/browse/HHH-15802]
If this can’t be fixed it would be great if could somehow disable this early query path comparison, so that we don’t have to check our entire DAL-Layer (we are talking about thousands of lines of code) for problems. |
|