2016-05-24 14 views
1

ich aus der Datenbank Bündel von Personen wie folgt holen:Hibernate Criteria API - update viele Zeilen mit einer Datenbankabfrage

public List<Object[]> getLimitedBunchOfPersons(Integer limit) { 

    Criteria criteria = getSession().createCriteria(Person.class, "person") 
      .setProjection(
        Projections.projectionList() 
         .add(Projections.property("person.personId"), "personId") 
        ) 
      .createAlias("person.status","status") 
      .add(Restrictions.eq("status.statusId", 1L)) 
      .addOrder(Order.asc("person.createdOn")); 

    return criteria.setMaxResults(limit).list(); 
} 

Da musste ich die Dinge beschleunigen, habe ich nur geholt IDs meiner Einheit. Wichtig zu beachten ist, dass ich mit einer großen Anzahl von Zeilen manipuliere und für eine Abfrage die maxResults Einschränkung verwenden musste.

Jetzt ist mein Problem, wie leicht mit Hibernate Criteria API in einer Datenbank Abfrage alle abgerufenen Zeilen von zuvor genannten Abfrage zu aktualisieren?

Plain SQL-Abfrage würde wie folgt gehen:

UPDATE PERSON 
SET STATUS = 2, CREATED_ON = CURRENT_TIMESTAMP 
WHERE STATUS = 1; 

Es ist wichtig, dass Update-Methode gleiche order und limit als getLimitedBunchOfPersons() Methode verwenden müssen, um beachten.

+1

Sie können die IDs von Personen zurückerhalten in vorherigen Kriterien Abfrage und Sie können diese IDs übergeben, in dem Zustand der Update-Abfrage. – Ramesh

+0

Du hast mir eine tolle Idee gegeben – shx

Antwort

1

Für Einzelnen Gegenstand wird es funktionieren wie nach dem Code folgt

Person per= (Person) criteria.uniqueResult(); 
per.setCreatedOn("crtBy"); 
currentSession.merge(per); 

Wenn nun in der Liste kommt können Sie die Liste iterieren von erwähnten Code in Ihrer Liste Iteration vorbei