Enumerating @NamedQuery within @NamedQueries

Login | Register

Enumerating @NamedQuery within @NamedQueries

Jpa

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

About

At Develop In Java, we've been a part of the Java community for over 10 years. If there's anything you'd like us to cover, just ask !

Current versions

  • Java - 1.8
  • Java EE - 7
  • Spring - 4.x