Рубрики
Без рубрики

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

Введение Если вы разработчик Java, использующий JPA, скорее всего, вы объявили один или… Помеченный java, аннотации.

Вступление

Если вы разработчик 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”