Вопрос

Какова лучшая практика для этой проблемы? Есть ли встроенные пакетные функции?

Образец кода:

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

Заранее спасибо.

Это было полезно?

Решение

HQL поддерживает пункт IN, и если вы используете SetParameterList, вы даже можете пройти в коллекцию.

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

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

Имейте в виду, как упомянуто Ddango в комментарии, что каскады отношений, указанные в ваших объектах, не будут выполняться, поскольку запуск запроса HQL просто переводится в запрос DB и фактически не загружает объекты объектов.

Другие советы

У меня были проблемы с получением ответа на работу, и я обнаружил, что следующий запрос сработал 100%

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

Клиент - это имя класса, а не имя таблицы. Идентификатор является строчным, а в HQL он является основным ключом, а не именем свойства в классе (имена свойств поддерживаются)

Вы можете использовать HQL для удаления нескольких объектов

Ищите Delete здесь - для Session.Delete Пример

Пример удаления HQL (вы можете использовать в 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();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top