¿Cómo eliminar múltiples entidades de DB con NHibernate?
-
18-09-2019 - |
Pregunta
¿Cuál es la mejor práctica para este problema? ¿Hay alguna característica de lotes incorporada?
Código de muestra:
using (ITransaction transaction = _session.BeginTransaction())
{
_session.Delete("FROM myObject o WHERE o.Id = IN(1,2,...99999)");
transaction.Commit();
}
Gracias por adelantado.
Solución
HQL admite la cláusula In y si usa SetParameterList incluso puede pasar en una colección.
var idList = new List<int>() { 5,3,6,7 };
_session.CreateQuery("DELETE MyDataClass o WHERE o.Id IN (:idList)")
.SetParameterList("idList", idList)
.ExecuteUpdate();
Tenga en cuenta, como mencionado por Ddango en un comentario, que las cascadas de relaciones especificadas en sus objetos no se ejecutarán ya que ejecutar una consulta HQL simplemente se traduce en una consulta de DB y en realidad no carga ningún objeto de entidad.
Otros consejos
Tuve problemas para obtener la respuesta al trabajo y encontré que la siguiente consulta funcionaba al 100%
Session.CreateQuery("delete Customer c where c.id in (:deleteIds)")
.SetParameterList("deleteIds", deleteIds)
.ExecuteUpdate();
El cliente es el nombre de clase, no el nombre de la tabla. ID es minúscula y en HQL es la clave principal, no un nombre de propiedad en la clase (los nombres de propiedad son compatibles)
Puede usar HQL para eliminar varios objetos
Busque Eliminar aquí - para session.delete Ejemplo
Ejemplo de eliminación de HQL (puede usar con HQL):
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();