JavaRush /Курсы /Модуль 4. Работа с БД /Другие типы запросов

Другие типы запросов

Модуль 4. Работа с БД
10 уровень , 5 лекция
Открыта

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

1
Задача
Модуль 4. Работа с БД, 10 уровень, 5 лекция
Недоступна
task1010
В методе getAll получи сессию из MySessionFactory.getSessionFactory()...
Комментарии (6)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Андрей Уровень 109
1 июля 2024
Отличные лекции по Hibernate. Для краткого ознакомления как раз.
Антон Уровень 23 Expert
16 января 2023
Разве в последнем примере нет ошибки session.createNamedQuery("Employee_GetAll", Employee.class), ведь речь идет о NamedNativeQuery, а не о NamedQuery?
Владимир Чугуевец Уровень 108 Expert
25 января 2023
пишут что Named тоже может быть Native
Anonymous #3322801 Уровень 2 Expert
16 ноября 2023
Ты в самой аннотации пишешь что они Native, а в коде уже используешь их как Named. А в последнем примере действительно есть ошибка, правильно так:

Query<Employee> query = session.createNamedQuery("Employee_GetAll", Employee.class);
List<Employee> resultLIst = query.list();
Sergey Drogunov Уровень 111 Expert
18 декабря 2022
Жаль нету задач по аннотациям.
Anonymous #3322801 Уровень 2 Expert
16 ноября 2023
Можно свой проект создать по запросам в этом левеле и привязать к ним аннотации) отличная практика будет)