6.1 NamedQueries

Hibernate дозволяє не зберігати запити прямо у коді. Натомість він пропонує давати запитам імена та зберігати їх окремо у вигляді анотацій. Ну а потім брати потрібний запит прямо на його ім'я. Приклад:

@org.hibernate.annotations.NamedQueries({
    @org.hibernate.annotations.NamedQuery(name = "Employee_FindById",
  	query = "from Employee where id = :id"),
    @org.hibernate.annotations.NamedQuery(name = "Employee_FindAllEmployes",
  	query = "from Employee"),
    @org.hibernate.annotations.NamedQuery(name = "Employee_UpdateEmployeeName",
  	query = "Update Employee set name = :newName where id = :id"),
...
})

Анотації можна додати перед будь-яким Entity-класом: імена запитів не прив'язані до жодного Entity.

Також до запиту (query) можна додати різні параметри:

@org.hibernate.annotations.NamedQuery(
  name = "Employee_ FindAllEmployes",
  query = "from Employee",
  timeout = 1,
  fetchSize = 10,
  cacheable = true,
  cacheMode = "GET"
)

Використовувати такі запити дуже просто – для цього потрібно використовувати метод createNamedQueryзамість методу createQuery:


Query<Employee> query = session.createNamedQuery("Employee_FindAllEmployes", Employee.class);
List<Employee> resultLIst = query.list();

6.2 NativeQuery

І ще одна проста, але дуже корисна річ – NativeQuery .

Якщо ти не хочеш використовувати HQL, але хочеш використовувати Hibernate для мапінгу сутностей, то ти можеш писати запити на старому доброму SQL. Ніхто тебе не обмежує.

Для цього лише потрібно викликати метод createNativeQuery(), замість createQuery().


NativeQuery<Employee> query = session.createNativeQuery("select * from employee", Employee.class);
List<Employee> resultLIst = query.list();

Ти просто пишеш createNativeQueryі все працюватиме, як і раніше. Цей метод повертає об'єкт типу NativeQuery , який підтримує всі методи, що і клас Query . Тобі нічого не зміниться.

Крім того, Native SQL Query також можна зберігати у вигляді Named Queries .


@org.hibernate.annotations.NamedNativeQueries(
    @org.hibernate.annotations.NamedNativeQuery(name = "Employee_GetAll",
  	query = "select * from employee",
  	resultClass = Employee.class)
)

І звичайно ж наведемо код роботи з ними:


NativeQuery<Employee> query = session.createNamedQuery("Employee_GetAll", Employee.class);
List<Employee> resultLIst = query.list();