Enumerating @NamedQuery within @NamedQueries
Introduction
If you’re a Java developer using JPA, chances are that you’ve declared one or more @NamedQuery
objects on your entities.
To declare a @NamedQuery
on a class, the class must simply be annotated with the name of the query and its JPQL, such as:
1 2 3 4 | @Entity @NamedQuery (name = "findAllProjects" , query = "select p from Project p order by p.id" ) public class Project |
If however, we wish to declare multiple @NamedQuery
annotations, we annotate the class with a @NamedQueries
annotation which then contains a collection of @NamedQuery
annotations as follows:
1 2 3 4 5 6 7 8 | @Entity @NamedQueries ({ @NamedQuery (name = "findAllProjects" , query = "select p from Project p order by p.id" ), @NamedQuery (name = "findById" , query = "select p from Project p where p.id=:id" ) }) public class Project |
Enumerating the @NamedQuery annotations
Once you’ve created an entity with multiple @NamedQuery
annotations, how can you check what annotations are present on the class?
Fortunately using reflection, its a fairly simple matter to enumerate the annotations on the class and find the details about them as shown in the following code.
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 | NamedQueries annotation = Project. class .getAnnotation( NamedQueries. class ); for (Annotation annot : annotation.value()) { System.out.println(annot.toString()); for (Method method : annot.annotationType().getDeclaredMethods()) { if (method.getName().equalsIgnoreCase( "name" ) || method.getName().equalsIgnoreCase( "query" )) { try { String result = method.getName() + " : " + method.invoke(annot, null ).toString(); System.out.println(result); } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { // Oops - something has gone wrong. break ; } } } } |
Running the above code produces the following output:
1 2 3 4 5 6 7 | @javax .persistence.NamedQuery(lockMode=NONE, hints=[], name=findAllProjects, query=select p from Project p order by p.id) name : findAllProjects query : select p from Project p order by p.id @javax .persistence.NamedQuery(lockMode=NONE, hints=[], name=findById, query=select p from Project p where p.id=:id) name : findById query : select p from Project p where p.id=:id |
Reference: | Enumerating @NamedQuery within @NamedQueries from our JCG partner David Salter at the David Salter’s Blog blog. |
Exactly what I was looking for. Thanks.