6.1 Query nominative

Hibernate ti consente di non memorizzare le query direttamente nel codice. Invece, suggerisce di assegnare nomi alle query e di memorizzarli separatamente come annotazioni. Bene, allora prendi la richiesta desiderata direttamente dal suo nome. Esempio:

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

Le annotazioni possono essere aggiunte prima di qualsiasi classe di entità: i nomi delle query non sono legati a nessuna entità.

Puoi anche aggiungere vari parametri alla query (query):

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

L'utilizzo di tali richieste è molto semplice: per questo è necessario utilizzare un metodo createNamedQueryanziché un metodo createQuery:


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

6.2 Query nativa

E un'altra cosa semplice ma molto utile è NativeQuery .

Se non si desidera utilizzare HQL, ma si desidera utilizzare Hibernate per la mappatura delle entità, è possibile scrivere query nel buon vecchio SQL. Nessuno ti limita.

Per fare ciò, devi solo chiamare il metodo createNativeQuery(), invece di createQuery().


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

Basta scrivere createNativeQuerye tutto funzionerà come prima. Questo metodo restituisce un oggetto di tipo NativeQuery , che supporta tutti i metodi supportati dalla classe Query . Nulla cambierà per te.

Inoltre, Native SQL Query può essere archiviata anche come Named Query .


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

E, naturalmente, ecco il codice per lavorare con loro:


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