Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to create an 'instance of' -like query in JPA 2.0?

Say we've got an abstract @Entity Animal, and several entity classes that extend Animal, including Dog, Cat, Monkey and Bat.

How can I filter the results based on the extending entity's class?

Example: There are checkboxes where the user can select which entities to retrieve.

[ ] Dog
[X] Cat
[X] Monkey
[ ] Bat

Now I want to retrieve the entities with a (Named)Query defined in the Animal class. What kind of query parameters can I put into the query so that only the Cat and Monkey objects will be returned?

like image 963
Kimi Avatar asked Oct 18 '11 13:10

Kimi


1 Answers

I'm not absolutely sure it's supported by JPA, but the way to do it in Hibernate, regardless of the inheritance strategy, and thus even if you don't have a discriminator (or didn't map it as a property) is to use the implicit class property :

String jpql = "select a from Animal a where a.class in (:classes)";
Query q = em.createQuery(jpql).setParameter("classes", 
                                            Arrays.asList(Cat.class, Monkey.class));

EDIT :

I just found it's possible in JPA2 using the TYPE operator :

String jpql = "SELECT a FROM Animal a WHERE TYPE(a) IN :classes";
Query q = em.createQuery(jpql).setParameter("classes", 
                                            Arrays.asList(Cat.class, Monkey.class));
like image 102
JB Nizet Avatar answered Sep 20 '22 07:09

JB Nizet