DEV Community

Cover image for Enumerating @NamedQuery within @NamedQueries
Davey
Davey

Posted on • Edited on • Originally published at davidsalter.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") public class Project 
Enter fullscreen mode Exit fullscreen mode

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 
Enter fullscreen mode Exit fullscreen mode

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; } } } } 
Enter fullscreen mode Exit fullscreen mode

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 
Enter fullscreen mode Exit fullscreen mode

Credits

Photo by Xavier von Erlach on Unsplash

Top comments (0)