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();
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ