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_FindAllEmployees",
  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_FindAllEmployees",
  query = "from Employee",
  timeout = 1,
  fetchSize = 10,
  cacheable = true,
  cacheMode = "GET"
)

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


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

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();