Question

Quelle est la meilleure pratique pour ce problème? Y at-il des caractéristiques de dosage intégré?

Exemple de code:

using (ITransaction transaction = _session.BeginTransaction())
{
   _session.Delete("FROM myObject o WHERE  o.Id = IN(1,2,...99999)");
   transaction.Commit();
}

Merci d'avance.

Était-ce utile?

La solution

HQL soutient la clause IN, et si vous utilisez setParameterList vous pouvez même passer dans une collection.

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

_session.CreateQuery("DELETE MyDataClass o WHERE o.Id IN (:idList)")
    .SetParameterList("idList", idList)
    .ExecuteUpdate();

Sachez, comme mentionné par ddango dans un commentaire, que les cascades de relations spécifiées dans vos objets ne seront pas exécutées depuis l'exécution d'une requête HQL traduit simplement une requête DB et ne se charge pas réellement des objets d'entité.

Autres conseils

J'ai eu des problèmes pour obtenir la réponse au travail et j'ai trouvé la requête suivante a travaillé 100%

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

Client est le nom de la classe et non le nom de la table. id est minuscule et HQL est la clé primaire et non un nom de propriété dans la classe (noms de propriété sont pris en charge)

vous pouvez utiliser HQL supprimer plusieurs objets

Rechercher Supprimer ici - pour Session.delete exemple

HQL SUPPRIMER exemple (vous pouvez utiliser avec 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();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top