2016-06-16 52 views
19

Sto aggiornando all'ultima versione di Hibernate 5.2.0 FINAL da Hibernate 3.x. Nel mio vecchio codice stavamo usando le query sui criteri come di seguito.Correggere l'alternativa a SharedSessionContract.createCriteria (Classe persistentClass) in Hibernate 5.2

Session session =getHibernateTemplate().getSessionFactory().getCurrentSession(); 
Criteria criteria = session.createCriteria(Employee.class); 
criteria.add(Restrictions.eq("Department", department)); 
return criteria.list(); 

Ora da Hibernate 5.2.0 il metodo createCriteria() è stato deprecato. Che può essere trovato dalla seguente documentazione.

https://docs.jboss.org/hibernate/orm/5.2/javadocs/deprecated-list.html https://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/SharedSessionContract.html#createCriteria-java.lang.Class-

La documentazione suggerisce di utilizzare criteri di JPA. Qui di seguito sono le poche domande che ho basato sullo sfondo di cui sopra.

  1. Dato che non stiamo usando l'EntityManager e fortemente dipendente dal HibernateDAOSupport e HibernateTemplate, come posso utilizzare i criteri di JAP utilizzando la sessione o sessionFactory?

  2. Se utilizzo DetachedCriteria come nello snippet di codice seguente, sarà uguale all'implementazione precedente o il codice riportato di seguito ci fornirà risultati indipendenti dalla sessione?

    DetachedCriteria criteria = DetachedCriteria.forClass(Employee.class); 
    criteria.add(Restrictions.eq("Department", department)); 
    return (List<Employee>) getHibernateTemplate().findByCriteria(criteria); 
    
  3. anche in alternativa, Se uso il DetachedCriteria in maniera seguito menzionato sta andando ad avere lo stesso impatto del mio vecchio codice.

    Session session =getHibernateTemplate().getSessionFactory().getCurrentSession(); 
    DetachedCriteria criteria = DetachedCriteria.forClass(Employee.class); 
    criteria.add(Restrictions.eq("Department", department)); 
    return criteria .getExecutableCriteria(session).list(); 
    

Se c'è un modo migliore per affrontare questo si prega di suggerire come io non voglio cambiare l'uso di HibernateDAOSupport e HibernateTemplate.

+7

Sono contento di non essere l'unico al mondo confuso con questo improvviso cambiamento di Hibernate (considerando vengo 5.1). Non so se iniziare a pensare come implementare con criteri o tornare alla 5.1. – russellhoff

+0

Bel esempio su: [il metodo Session's createCriteria è deprecato, come dovrei procedere per stabilire i criteri di Classe?] (Https://teamtreehouse.com/community/the-sessions-method-createcriteria-is-deprecated-how-should- i-procedo-per-la definizione di criteri di classe-) – rvheddeg

risposta

3

Seguendo il link Doc è stati:

"eredità Hibernate org.hibernate.Criteria API, che dovrebbe essere considerato deprecato"

Quindi, solo il passaggio a DetachedCriteria sarà sbarazzarsi di deprezzamento corrente, ma la sua suggerendo utilizzare i criteri JPA (che non supporta org.hibernate.criterion.Restrictions etc). Non è chiaro e la roadmap non è di grande aiuto.

Lo fa menzione:

"criteri Alla fine, Hibernate-specificità sarà portato come le estensioni per l'APP javax.persistence.criteria.CriteriaQuery"

Hai ricevuto ulteriormente con questo?

3

In ibernazione 5.2, org.hibernate.Session implementa javax.persistence.EntityManager, quindi è possibile creare query di criteri utilizzando Session direttamente. Vedi JPA - Criteria API.

Ma potrebbe esserci un errore in ibernazione 5.2.1.Final, setCacheable non funziona se si chiama l'API JPA Criteria TypedQuery#getResultList, chiamare invece Query#list().

public <T> T getAll(Class<T> clazz, boolean cache){ 
    CriteriaQuery<T> query = getCurrentSession().getCriteriaBuilder().createQuery(clazz); 
    query.select(query.from(clazz)); 
    Query<T> q = getCurrentSession().createQuery(query); // CriteriaQueryTypeQueryAdapter instance 
    q.setCacheable(cache); // execute AbstractProducedQuery#setCacheable 
// return q.getResultList(); // CriteriaQueryTypeQueryAdapter#getResultList(), cache not works 
    return q.list(); // AbstractProducedQuery#list() cache may be enabled 
} 
4

Usa CriteriaBuilder come descritto di seguito:

//Use below imports: 
import javax.persistence.criteria.CriteriaBuilder; 
import javax.persistence.criteria.CriteriaQuery; 
import javax.persistence.criteria.Root; 

//creating session. This you can create in your own way. 
Configuration cfg = new Configuration(); 
cfg.configure("hibernate.cfg.xml"); 
cfg.addAnnotatedClass(Employee.class); 

SessionFactory factory = cfg.buildSessionFactory(); 
Session session = factory.openSession(); 

//**creating CriteriaBuilder** 
CriteriaBuilder builder = session.getCriteriaBuilder(); 
CriteriaQuery<Employee> criteria = builder.createQuery(Employee.class); 
Root<Employee> employeeRoot=criteria.from(Employee.class); 
criteria.select(employeeRoot); 

//**Adding where clause** 
criteria.where(builder.equal(employeeRoot.get("employeeId"), "E01")); 
List<Employee> employeeList=session.createQuery(criteria).getResultList();