Pawel Veselov created OPENJPA-2931: -------------------------------------- Summary: Comparing objects with composite keys through criteria API doesn't work in joins Key: OPENJPA-2931 URL: https://issues.apache.org/jira/browse/OPENJPA-2931 Project: OpenJPA Issue Type: Bug Components: criteria, query, sql Affects Versions: 3.1.2 Reporter: Pawel Veselov
I'm relatively certain this affects downstream as well. This is probably incomplete/incorrect fix for OPENJPA-2631. I've added this test to TestCompositePrimaryKeys.java: {code:java} public void testFindUsingCriteriaBuilderOnSubjectWithJoin() { Subject sub = em.find(Subject.class, new SubjectKey(1, "Type")); CriteriaBuilder builder = em.getCriteriaBuilder(); CriteriaQuery<SubTopic> cq = builder.createQuery(SubTopic.class); Root<SubTopic> root = cq.from(SubTopic.class); Join<SubTopic, Topic> join = root.join(SubTopic_.topic); cq.where(builder.equal(join.get(Topic_.subject), sub)); root.fetch(SubTopic_.topic); TypedQuery<SubTopic> query = em.createQuery(cq); SubTopic found = query.getSingleResult(); Assert.assertNotNull(found); Assert.assertEquals(Integer.valueOf(8), found.getId()); } {code} Having a basic additional entity SubTopic: {code:java} @Entity @Table(name = "SUB_TOPIC") public class SubTopic { @Id @Column(name = "ID") private Integer id; @ManyToOne(fetch = FetchType.LAZY) private Topic topic; public SubTopic() { } } {code} The test fails with: {noformat} Caused by: java.lang.NullPointerException at org.apache.openjpa.jdbc.kernel.exps.EqualExpression.appendTo(EqualExpression.java:89) at org.apache.openjpa.jdbc.kernel.exps.CompareEqualExpression.appendTo(CompareEqualExpression.java:113) at org.apache.openjpa.jdbc.kernel.exps.BindVariableAndExpression.appendTo(BindVariableAndExpression.java:61) at org.apache.openjpa.jdbc.kernel.exps.SelectConstructor.buildWhere(SelectConstructor.java:313) at org.apache.openjpa.jdbc.kernel.exps.SelectConstructor.evaluate(SelectConstructor.java:95) at org.apache.openjpa.jdbc.kernel.JDBCStoreQuery.createWhereSelects(JDBCStoreQuery.java:372) at org.apache.openjpa.jdbc.kernel.JDBCStoreQuery.executeQuery(JDBCStoreQuery.java:203) at org.apache.openjpa.kernel.ExpressionStoreQuery$DataStoreExecutor.executeQuery(ExpressionStoreQuery.java:831) at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:1060) {noformat} OPENJPA-2631 relies on the ClassMetadata being there for the evaluated paths, but in case of joins, it's not set. -- This message was sent by Atlassian Jira (v8.20.10#820010)