Pergunta

Qual é a melhor prática para esse problema? Existe algum recurso de lote embutido?

Código de amostra:

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

Desde já, obrigado.

Foi útil?

Solução

O HQL suporta a cláusula In e, se você usar o SetParameterList, poderá até passar em uma coleção.

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

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

Esteja ciente, como mencionado por Ddango em um comentário, que o relacionamento em cascata especificado em seus objetos não será executado, pois a execução de uma consulta HQL simplesmente se traduz em uma consulta de banco de dados e na verdade não carrega nenhum objetos de entidade.

Outras dicas

Eu tive problemas para obter a resposta para o trabalho e encontrei a seguinte consulta funcionou 100%

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

O cliente é o nome da classe, não o nome da tabela. O ID é minúsculo e, no HQL, é a chave primária que não é um nome de propriedade na classe (os nomes de propriedades são suportados)

Você pode usar o HQL para excluir vários objetos

Procure Excluir aqui - para o exemplo session.delete

Exemplo de exclusão HQL (você pode usar com 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();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top