Вступление
Если вы разработчик Java, использующий JPA, скорее всего, вы объявили один или несколько @NamedQuery
объекты на ваших объектах.
Чтобы объявить @NamedQuery
в классе, класс должен быть просто аннотирован именем запроса и его JPQL, например:
@Entity @NamedQuery(name = "findAllProjects", query = "select p from Project p order by p.id") public class Project
Если, однако, мы хотим объявить несколько @NamedQuery
аннотации, мы аннотируем класс аннотацией @NamedQueries
, которая затем содержит коллекцию @NamedQuery
аннотаций следующим образом:
@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
аннотациями, как вы можете проверить, какие аннотации присутствуют в классе?
К счастью, используя отражение, довольно просто перечислить аннотации к классу и найти подробную информацию о них, как показано в следующем коде.
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; } } } }
Выполнение приведенного выше кода приводит к следующему результату:
@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
Кредиты
Фото Ксавье фон Эрлах на Unsplash
Оригинал: “https://dev.to/davey/enumerating-namedquery-within-namedqueries-70n”