2016-06-16 10 views
19

Ich aktualisiere auf Hibernate 5.2.0 FINAL von Hibernate 3.x. In meinem alten Code verwendeten wir Kriterienabfragen wie unten.Korrekte Alternative zu SharedSessionContract.createCriteria (Klasse persistente Klasse) in Hibernate 5.2

Ab Hibernate 5.2.0 ist die Methode createCriteria() veraltet. Welche finden Sie in der folgenden Dokumentation.

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-

Die Dokumentation schlägt JPA Kriterien zu verwenden. Im Folgenden sind die wenigen Fragen, die ich auf dem obigen Hintergrund habe.

  1. Da wir nicht mit den EntityManager und stark abhängig von der HibernateDAOSupport und HibernateTemplate, wie ich die JAP Criteria mit der Sitzung oder session verwenden kann?

  2. Wenn ich DetachedCriteria wie im folgenden Codefragment verwende, ist es dasselbe wie bei der vorherigen Implementierung oder der folgende Code gibt uns sitzungsunabhängige Ergebnisse?

    DetachedCriteria criteria = DetachedCriteria.forClass(Employee.class); 
    criteria.add(Restrictions.eq("Department", department)); 
    return (List<Employee>) getHibernateTemplate().findByCriteria(criteria); 
    
  3. auch als Alternative, wenn ich die DetachedCriteria Verwendung in unten genannten Weise wird es die gleiche Wirkung wie mein alten Code haben.

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

Wenn es ein besserer Weg, damit umzugehen ist, bitte vorschlagen, wie ich will, um die Verwendung von HibernateDAOSupport und HibernateTemplate nicht ändern.

+7

Ich bin froh, dass ich bin nicht die einzige in der Welt mit dieser plötzlichen Änderung in Hibernate verwirrt (unter Berücksichtigung Ich kam von 5.1). Ich weiß nicht, ob ich darüber nachdenken soll, wie man mit Kriterien umsetzt oder auf 5.1 zurückgreift. – russellhoff

+0

Schönes Beispiel zu: [die Methode createCriteria der Session ist veraltet, wie soll ich fortfahren, um Klassenkriterien zu erstellen?] (Https://teamtreehouse.com/community/the-sessions-method-createcriteria-is-deprecated-how-should- i-procee-for-etabling-Klassenkriterien) – rvheddeg

Antwort

3

doc Link Es folgt lautet:

„Legacy Hibernate org.hibernate.Criteria API, die als veraltet betrachtet werden sollten“

Also nur zu DetachedCriteria Schalt wird von der aktuellen Abwertung loszuwerden, aber seine was darauf hindeutet, die JPA-Kriterien zu verwenden (die org.hibernate.criterion.Restrictions usw. nicht unterstützt). Es ist unklar und die Roadmap hilft nicht viel.

Es tut Erwähnung:

„Schließlich Hibernate spezifischen Kriterien Merkmale werden als Erweiterungen der JPA javax.persistence.criteria.CriteriaQuery portiert werden“

Sie weitere mit diesem gekommen?

3

Im Hibernate 5.2, org.hibernate.Session implementiert javax.persistence.EntityManager, so können Sie Kriterien Abfrage direkt über Session erstellen. Siehe JPA - Criteria API.

Aber es kann einen Fehler im Ruhezustand geben 5.2.1.Final, setCacheable funktioniert nicht, wenn JPA Criteria API TypedQuery#getResultList aufrufen, rufen Sie stattdessen 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

Verwenden CriteriaBuilder wie unten beschrieben:

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