2009-08-10 4 views
7

Wie valide HQL-String zu bauen, die zuWie wird 'Null' mit HQL in Spalte gesetzt?

UPDATE Tabelle SET-Feld = null WHERE ....

+0

kann eine dumme Frage sein, aber funktioniert dieses SQL-Update von einigen SQL-Konsole? Haben Sie vielleicht eine Einschränkung NOT NULL über das Spaltenfeld? –

+0

Die SQL ist in Ordnung - es funktioniert von der Konsole gut! –

Antwort

2

Haben Sie bulk HQL aktualisieren bedeuten gleichwertig ist? Versuchen Sie, diese

UPDATE myEntity e SET e.myProperty = null WHERE ... 

Sie auch eine parametrisierte Version des obigen

UPDATE myEntity e SET e.myProperty = :param WHERE ... 

In Ihrem Code verwenden können:

int updatedEntities = session.createQuery(updateQueryHQL) 
    .setString("param", myValue) // or .setString("param", null) 
    .executeUpdate(); 

documentation für Details.

Wenn Sie keine Bulk-Updates durchführen, sollten Sie einfach Ihre Eigenschaft auf NULL setzen und die Entität normal beibehalten.

+0

Danke, aber ... beide Versionen werfen HibernateException !!! setString ("param", meinWert) executeUpdate(); funktioniert nur, wenn myValue nicht null ist !!! –

+0

Welche Art von HibernateException (was sagt der Fehler)? Erlaubt Ihre Tabelle NULL in dieser Spalte? Ist diese Eigenschaft tatsächlich eine Zeichenfolge oder ist sie von einer anderen Art? – ChssPly76

+0

1. Die Tabellenspalte erlaubt NULL 2. Die Eigenschaft ist eigentlich String (das gleiche Problem mit Spalte des Typs 'Date') 2. Hibernate Exception Fehler ist leider ungültig ('UPDATE Erlaubnis fehlt auf Objekt .....) . Ist nicht wahr: Falls myValue eine leere Zeichenfolge oder kein Nullwert ist - die angeforderte Spalte wird ohne Probleme aktualisiert –

0

Warum muss Ihre Update-Anweisung in HQL durchgeführt werden? Ist diese Tabelle einer Entität im System zugeordnet? Wenn Sie dies tun, können Sie einfach die Eigenschaft, die dieser Spalte zugeordnet ist, auf null setzen und eine Sicherung für diese Entität ausführen. z.B.

myObject.setMyProperty (null); getSessionFactory(). GetCurrentSession(). Speichern (myObject);

Das sollte für Sie arbeiten, aber Sie müssen eine Entität auf die fragliche Tabelle zugeordnet haben.