Posted under Java
Permalink
Tags Eclipselink, Generics, Gotcha, Java, JPA, Tip, Tutorial
Update 30/1/2012
After further testing, I have found more issues trying to use a parameterised concrete class in a JPA constructor expression. EclipseLink was throwing MethodNotFoundException complaining that it could not find the constructor method for the class, due to the use of the parameterised type in one of the constructor arguments. The precise circumstances where this does and does not work are not clear.
My solution has been to not use a parameterised class at all in a JPA constructor expression. To avoid most of the code duplication, what I did was to subclass the parameterised class for each concrete type I was using, i.e. I created a concrete subclass which only contained a constructor calling the superclass constructor. This then allowed me to use a typed query in JPA, as the returned class was now non-parameterised and so I could create a class literal for it.
Original Post
Whilst in some situations this may be an issue, it is also a statement of fact!
This is due to type erasure at run time, and cannot be done.
It means, for example, that in some cases it is not possible to completely eliminate unchecked warnings.
One example of mine was the use of a parameterised type in a constructor expression class in JPA. I had a requirement to do fetches which involved returning an entity plus another column that could not be handled as a relationship/JPA entity property. The property in question was the count of children for a tree node entity. As I was using path enumeration to describe the tree, I could not use JPA relationships to handle it, and so had to return the child count separately. I had more than one type of tree, all handled polymorphically, and so wanted to re-use the constructor class by making it parameterised.
This all worked fine but the class could not have its class literal passed when created a TypedQuery to fetch the results back. The solution was to use some casting isolated in a specific method, and to suppress the generic warnings via @SuppressWarnings("unchecked").
The following posts detail this issue:-
http://stackoverflow.com/questions/2390662/java-how-do-i-get-a-class-literal-from-a-generic-type
Leave a Reply
You must be logged in to post a comment.