Вступление
Если вы являетесь 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 : findAllProjectsquery : 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 : findByIdquery : select p from Project p where p.id=:id |
| Ссылка: | Перечислите @NamedQuery в @NamedQueries от нашего партнера по JCG Дэвида Солтера в блоге Дэвида Солтера в блоге. |