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

undefined
1
Задача
Модуль 4. Работа с БД, 10 уровень, 5 лекция
Недоступна
task1010
В методе getAll получи сессию из MySessionFactory.getSessionFactory()...