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