wake-up-neo.com

einzelne Spalte nach Kriterien aktualisieren

Ich habe eine Tabelle, die Mamy-Spalten enthält, und ich möchte die eine oder die wenigen Spalten der Zeile aktualisieren, ohne die verbleibenden Spalten zu beeinflussen. Ich kann Abfrage schreiben:

update table as t set t.a=:a set t.b=:b where t.id=1

Aber ich weiß nicht, welche Spalten zum Aktualisieren ausgewählt werden, und ich denke, es ist keine gute Idee, jede Abfrage für jedes Szenario zu schreiben. Nun, ich muss für jedes Szenario eine Abfrage schreiben, aber ich suche nach einer besseren Möglichkeit, die Tabelle dynamisch zu aktualisieren. Ich denke, Kriterien wären eine gute Wahl. Das Problem ist aber, dass ich keine Ahnung habe, wie man Kriterien schreibt, um bestimmte Spalten zu aktualisieren. Mein Code kann jetzt die Spalte aktualisieren, aber er würde eine andere Spalte auf null oder leer setzen.

Wie können bestimmte Spalten aktualisiert werden, ohne andere Spalten zu ändern?

Der Ruhezustand unterstützt zwei grundlegende Methoden zum Aktualisieren der Tabellenspalten.

Das erste ist natürlich, indem Sie eine Entität in session laden, sie zur Laufzeit ändern, (udpate) die Änderungen zurück in die Datenbank schreiben. Dies ist der ORM-Stil ein Standard.

Die zweite ist hauptsächlich auf die Anweisung sehr effizientes SQL UPDATE ausgerichtet. Es ist hier dokumentiert als:

15.4. DML-artige Operationen

zitiere aus doc:

Hibernate bietet jedoch Methoden für die Ausführung von SQL-Massen-DML-Anweisungen, die über die Hibernate-Abfragesprache ausgeführt werden.

Es bietet keine API für die Kriterienabfrage, funktioniert jedoch mit HQL == in unserem Domain-Modell.

Wir können eine WHERE-Klausel über unseren zugeordneten Entitäten erstellen und nur für einige von uns ausgewählte Spalten eine Aktualisierung anfordern. Es gibt einige Einschränkungen (JOIN wird nicht unterstützt), aber sie können durch Unterabfragen gelöst werden ...

Dies ist ein Ausschnitt aus doc:

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

String hqlUpdate = "update Customer c set c.name = :newName where c.name = :oldName";
// or String hqlUpdate = "update Customer set name = :newName where name = :oldName";
int updatedEntities = session.createQuery( hqlUpdate )
        .setString( "newName", newName )
        .setString( "oldName", oldName )
        .executeUpdate();
tx.commit();
session.close();

Überprüfen Sie auch diese Fragen und Antworten: Update im Ruhezustand mit Kriterien ausführen

11
Radim Köhler

Mit JPA können Sie dies auf diese Weise tun.

CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaUpdate<User> criteria = builder.createCriteriaUpdate(User.class);
Root<User> root = criteria.from(User.class);
criteria.set(root.get("fname"), user.getName());
criteria.set(root.get("lname"), user.getlastName());
criteria.where(builder.equal(root.get("id"), user.getId()));
session.createQuery(criteria).executeUpdate();
3
Arjun Nayak

.setString( "newName", newName )-- ist veraltet, die neue Methode ist unten!

int updatedEntities1 = session.createQuery( hqlUpdate )
                    .setParameter("column_name", value)
                    .executeUpdate();
0