
Posted on • Edited on • Originally published atdavidsalter.com
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")publicclassProject
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")})publicclassProject
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.
NamedQueriesannotation=Project.class.getAnnotation(NamedQueries.class);for(Annotationannot:annotation.value()){System.out.println(annot.toString());for(Methodmethod:annot.annotationType().getDeclaredMethods()){if(method.getName().equalsIgnoreCase("name")||method.getName().equalsIgnoreCase("query")){try{Stringresult=method.getName()+" : "+method.invoke(annot,null).toString();System.out.println(result);}catch(IllegalAccessException|IllegalArgumentException|InvocationTargetExceptione){// Oops - something has gone wrong.break;}}}}
Running the above code produces the following output:
@javax.persistence.NamedQuery(lockMode=NONE,hints=[],name=findAllProjects,query=selectp from Project p order by p.id)name : findAllProjectsquery :selectp from Project p order by p.id@javax.persistence.NamedQuery(lockMode=NONE,hints=[],name=findById,query=selectp from Project p where p.id=:id)name : findByIdquery :selectp from Project p where p.id=:id
Credits
Photo byXavier von Erlach onUnsplash
Top comments(0)
For further actions, you may consider blocking this person and/orreporting abuse