2009-12-08 4 views

Antwort

17

HQL unterstützt die IN-Klausel, und wenn Sie verwenden setParameterList können Sie sogar eine Sammlung übergeben.

var idList = new List<int>() { 5,3,6,7 }; 

_session.CreateQuery("DELETE myObject o WHERE o.Id = IN (:idList)") 
    .SetParameterList("idList", idList) 
    .ExecuteUpdate(); 
+0

Was ist, wenn die idList riesig ist? Wie würdest du das umgehen? oder hat nhibernate irgendeine Form von eingebauter Dosierung? – Newbie

+0

Ich müsste einen Test mit nHibernate Profiler [nhprof.com] einrichten, um zu sehen, was tatsächlich an die DB gesendet wird, aber wenn ich raten müsste, würde ich sagen, dass es explizit wie Ihr hartcodiertes Beispiel aussehen würde. – joshperry

+2

Sie können eine Stapelgröße in Ihrer festlegen: 100. Basierend auf Ihrer HQL würde ich jedoch vermuten, dass nur eine einzige Abfrage ausgegeben wird (Stapel würden angewendet, wenn Sie eine Sammlung durchlaufen und auf ihnen Löschen aufrufen würden). – ddango

5

Sie können HQL Verwenden Sie mehrere Objekte

Look for delete here - for session.delete example

HQL DELETE Beispiel löschen (Sie können mit HQL verwenden):

ISession session = sessionFactory.OpenSession(); 
ITransaction tx = session.BeginTransaction(); 

String hqlDelete = "delete Customer c where c.name = :oldName"; 
// or String hqlDelete = "delete Customer where name = :oldName"; 
int deletedEntities = session.CreateQuery(hqlDelete) 
     .SetString("oldName", oldName) 
     .ExecuteUpdate(); 
tx.Commit(); 
session.Close(); 
9

Ich hatte Probleme, die Antwort zu bekommen gefunden zu arbeiten und ich die folgende Abfrage 100% gearbeitet

 Session.CreateQuery("delete Customer c where c.id in (:deleteIds)") 
      .SetParameterList("deleteIds", deleteIds) 
      .ExecuteUpdate(); 

Kunde ist der Klassenname nicht der Name Tabelle. ID ist Kleinbuchstaben und in HQL ist es der Primärschlüssel kein Eigenschaftsname in der Klasse (Eigenschaftsnamen werden unterstützt)

+0

Ja, und die einzige Einschränkung, die erwähnenswert ist, ist, dass die Kaskadierung nicht angewendet wird, da Sie das Objekt nicht laden. Wenn der Kunde also eine Adresszeile hat und diese normalerweise kaskadiert löscht, wird dies nicht berücksichtigt – PandaWood