Статьи

Перечисление @NamedQuery в @NamedQueries

Вступление

Если вы являетесь Java-разработчиком, использующим JPA, скорее всего, вы объявили один или несколько объектов @NamedQuery на своих объектах.

Чтобы объявить @NamedQuery для класса, класс должен быть просто аннотирован именем запроса и его JPQL, например:

1
2
3
4
@Entity
@NamedQuery(name = "findAllProjects",
            query = "select p from Project p order by p.id")
public class Project

Однако, если мы хотим объявить несколько аннотаций @NamedQuery , мы аннотируем класс аннотацией @NamedQueries которая затем содержит коллекцию аннотаций @NamedQuery следующим образом:

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

Перечисление аннотаций @NamedQuery

Как только вы создали сущность с несколькими аннотациями @NamedQuery , как вы можете проверить, какие аннотации присутствуют в классе?

К счастью, используя отражение, довольно просто перечислить аннотации к классу и найти детали о них, как показано в следующем коде.

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;
      }
    }
  }
}

Выполнение вышеуказанного кода приводит к следующему выводу:

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