How to delete multiple db entities with Nhibernate?

前端 未结 3 1250
情书的邮戳
情书的邮戳 2021-02-05 13:47

What is the best practice for this problem? Is there any batching features built-in?

Sample code:

using (ITransaction transaction = _session.BeginTransa         


        
相关标签:
3条回答
  • 2021-02-05 14:25

    you can Use HQL to delete multiple objects

    Look for delete here - for session.delete example

    HQL DELETE example (you can use IN with 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();
    
    0 讨论(0)
  • 2021-02-05 14:37

    HQL supports the IN clause, and if you use setParameterList you can even pass in a collection.

    var idList = new List<int>() { 5,3,6,7 };
    
    _session.CreateQuery("DELETE MyDataClass o WHERE o.Id IN (:idList)")
        .SetParameterList("idList", idList)
        .ExecuteUpdate();
    

    Be aware, like mentioned by ddango in a comment, that relationship cascades specified in your objects will not be executed since running an HQL query simply translates to a DB query and does not actually load any entity objects.

    0 讨论(0)
  • 2021-02-05 14:49

    I had problems getting the answer to work and I found the following query worked 100%

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

    Customer is the class name not the table name. id is lowercase and in HQL it is the Primary Key not a property name in the class (Property names are supported)

    0 讨论(0)
提交回复
热议问题