[
https://issues.apache.org/jira/browse/OPENJPA-2631?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15347591#comment-15347591
]
Heath Thomann commented on OPENJPA-2631:
----------------------------------------
Thanks for the review and comments Francesco! Regarding that commented out
code, it was deliberately commented out. Prior to this fix, it was a work
around. In other words, if you created a Criteria which selected the
individual fields of the PK then the test would work. For history sake I left
that commented code in the test case, but given your confusing I've added
better comments about why I left it in there.
Finally, I made SubjectIdClass Serializable. Thanks again for the detailed
review!
Thanks,
Heath
> ClassCastException occurs when an equals comparison query is executed on an
> entity with an @EmbeddedId that contains more than one field.
> -----------------------------------------------------------------------------------------------------------------------------------------
>
> Key: OPENJPA-2631
> URL: https://issues.apache.org/jira/browse/OPENJPA-2631
> Project: OpenJPA
> Issue Type: Bug
> Components: criteria, query, sql
> Affects Versions: 2.1.2, 2.2.3, 2.4.1
> Reporter: Heath Thomann
> Assignee: Heath Thomann
> Attachments: OPENJPA-2631-2.1.x.patch
>
>
> Take the following entity:
> @Entity
> public class Subject implements Serializable {
> @EmbeddedId
> private SubjectKey key;
> .......
> Where SubjectKey is as follows:
> @Embeddable
> public class SubjectKey implements Serializable {
> private Integer subjectNummer;
> private String subjectTypeCode;
> ......
> As you can see we have a composite primary key. With this, take this query:
> TypedQuery<Subject> query = em.createQuery("select s from Subject s where s =
> :subject", Subject.class);
> query.setParameter("subject", s);
> Subject s2 = query.getSingleResult();
> This query will yield the following exception:
> java.lang.ClassCastException:
> org.apache.openjpa.persistence.embed.compositepk.SubjectKey cannot be cast to
> [Ljava.lang.Object;]
> at org.apache.openjpa.jdbc.kernel.exps.Param.appendTo(Param.java:149)
> If we execute a corresponding 'em.find' of Subject, this exception doesn't
> occur. Furthermore, if you execute the same query for an entity with an
> @EmbeddedId that only contains one field, all will work as expected. The
> issue here is with an equals query where the entity contains an @EmbeddableId
> with more than two fields.
> While investigating/debugging this issue, I've found further issues when
> creating the query using CriteriaBuilder; both with an @Embeddable and
> @IdClass composite PKs. I will leave it as an exercise for the reader to
> view the attached test case to see how each issue can occur. Each test
> method details what issue it recreated before the fixes to this issue. I'm
> also attaching a patch with a proposed fix for the issues.
> Thanks,
> Heath Thomann
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)