6.1 Zapytania nazwane

Hibernate pozwala nie przechowywać zapytań bezpośrednio w kodzie. Zamiast tego sugeruje nadawanie zapytaniom nazw i przechowywanie ich oddzielnie jako adnotacji. Cóż, weź żądane żądanie bezpośrednio według jego nazwy. Przykład:

@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"),
...
})

Adnotacje można dodawać przed jakąkolwiek klasą Entity: nazwy zapytań nie są powiązane z żadnym Entity.

Możesz także dodać różne parametry do zapytania (zapytania):

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

Korzystanie z takich żądań jest bardzo proste - w tym celu należy użyć metody createNamedQueryzamiast metody createQuery:


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

6.2 Zapytanie natywne

Kolejną prostą, ale bardzo użyteczną rzeczą jest NativeQuery .

Jeśli nie chcesz używać HQL, ale chcesz używać Hibernate do mapowania jednostek, możesz pisać zapytania w starym, dobrym SQL. Nikt Cię nie ogranicza.

Aby to zrobić, wystarczy wywołać metodę createNativeQuery()zamiast createQuery().


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

Po prostu piszesz createNativeQueryi wszystko będzie działać jak wcześniej. Ta metoda zwraca obiekt typu NativeQuery , który obsługuje wszystkie metody obsługiwane przez klasę Query . Nic się dla ciebie nie zmieni.

Ponadto Native SQL Query może być również przechowywane jako Named Queries .


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

I oczywiście oto kod do pracy z nimi:


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