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:
@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:
@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.
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:
@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.