Como utilizar Criterias em Update e Delete no Nhibernate

61 views
Skip to first unread message

Diogo Menezes

unread,
Feb 2, 2010, 11:30:03 AM2/2/10
to nhiber...@googlegroups.com
Pessoal, com eu posso utilizar criterias para delete ou update ?

update tabela set campo = 'x' where campoY = 'teste';

ou

delete  from tabela where campoY = 'teste'; 

?

o ICriteria só aceita list e get, não tem save, update ou delete, como fariamos isso sem utilizar HQL e sem utilizar foreach como no exemplo abaixo??

foreach(X item in ListaItem)
{
      sessao.Delete(item);
}

--
Abraços,

Diogo Menezes
http://www.dmenezes.com.br

Jan Limpens

unread,
Feb 3, 2010, 8:12:38 AM2/3/10
to NHibernate-Br
você usa criteria para puxar o seu objeto e depois usa sua ISession
para salvar o seu objeto ou deixar o transient.

var myCat = Session.CreateCriteria("from cat where id = 5");
myCat.Color = "Muito colorida";
Session.SaveOrUpdate(myCat);

Diogo Menezes

unread,
Feb 3, 2010, 8:15:41 AM2/3/10
to nhiber...@googlegroups.com
Jan, obrigado pela resposta mas acho que você se equivocou, você usou HQL e não Criterias.

Queria algo para atualização em massa como por exemplo atualizar todos os ativos para inativos.

Entende ?

Abraços


--
Você está recebendo esta mensagem porque se inscreveu no grupo "NHibernate-Br" dos Grupos do Google.
Para postar neste grupo, envie um e-mail para nhiber...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para nhibernate-b...@googlegroups.com.
Para obter mais opções, visite esse grupo em http://groups.google.com/group/nhibernate-br?hl=pt-BR.

Rafael Mueller

unread,
Feb 3, 2010, 8:25:16 AM2/3/10
to nhiber...@googlegroups.com
"Criteria is a simplified API for retrieving entities by composing Criterion objects. This is a very convenient approach for functionality like "search" screens where there is a variable number of conditions to be placed upon the result set."

Acho que você terá que usar HQL.

Grato,
--
Rafael Mueller
http://queroseragil.wordpress.com


2010/2/3 Diogo Menezes <diogol...@gmail.com>

Diogo Menezes

unread,
Feb 3, 2010, 8:40:58 AM2/3/10
to nhiber...@googlegroups.com
Pessoal, de qualquer forma a aualização em massa não é feita facilmente....

Reparem que se fizermos

sessao.CreateCriteria(typeof(Usuario)).CreateQuery("from Pessoa p where p.Ativo = 1).List<Pessoa>();

Apenas estamos LISTANDO.

isso ai geraria algo como 

SELECT * FROM tb_pessoa p WHEREp.fl_ativo = 1

Eu queria um 

UPDATE tb_pessoa SET fl_ativo = 0 WHERE fl_ativo = 1

Entende ???


Se eu fizer da maneira tradicional ( com HQL e select ), sou obrigado a usar um foreach para atualizar o resultado, ocasionando varios updates ao invés de 1 só.

Rafael Mueller

unread,
Feb 3, 2010, 9:03:17 AM2/3/10
to nhiber...@googlegroups.com

Você deve utilizar o ExecuteUpdate


using (ISession s = sf.OpenSession()){ using(ITransaction tx = s.BeginTransaction()){ s.CreateSQLQuery("update pessoa set fl_ativo = 1") .ExecuteUpdate(); tx.Commit(); }


Diogo Menezes

unread,
Feb 3, 2010, 9:08:31 AM2/3/10
to nhiber...@googlegroups.com
Exato, com SQL eu sei... eu queria saber como fazer isso com Criteria ou HQL.

Fernando

unread,
Feb 3, 2010, 9:13:27 AM2/3/10
to nhiber...@googlegroups.com
            string HQLQuery = "";

            IQuery query;

            HQLQuery = "update EnderecoArmazem as endContrato set endContrato.flgAlocado = true where endContrato.codEnderecoArmazem in (:list)";
            query = session.CreateQuery(HQLQuery);
            query.SetParameterList("list", (from e in enderecoArmazemVOList select e.codEnderecoArmazem).ToArray<String>());

            query.ExecuteUpdate();

2010/2/3 Diogo Menezes <diogol...@gmail.com>

Rafael Mueller

unread,
Feb 3, 2010, 10:15:09 AM2/3/10
to nhiber...@googlegroups.com
Escrevi meu exemplo errado, usando hql
string hql = "update pessoa p set p.Ativo=:a where qa.ID = > 1500";
IQuery q = session.CreateQuery(hql).SetBoolean("a", true);

Mas isso só vai funcionar em nh 2.1+
Em nh 2.0+ você pode fazer isso usando sql

Grato,
--
Rafael Mueller
http://queroseragil.wordpress.com


2010/2/3 Fernando <fernando...@gmail.com>

Jan Limpens

unread,
Feb 3, 2010, 1:39:58 PM2/3/10
to nhiber...@googlegroups.com
em geral, usando nhibernate de um jeito para que ele foi concebido, você puxa o seu entity na sua session, faz as mudanças na entity e salva a entity na session.

embora que existem updates com hql (mas com certeza não com criteria) no trunk do nh 3.0, se não me engano, o caminho tipíco no uso de orm é esse.

2010/2/3 Rafael Mueller <muell...@gmail.com>



--
Jan

Diogo Menezes

unread,
Feb 3, 2010, 2:09:11 PM2/3/10
to nhiber...@googlegroups.com
Sim mas é simplesmente TOSCO fazer 100.000 updates quando se pode fazer apenas 1, não acham ?

Rafael Mueller

unread,
Feb 3, 2010, 2:25:00 PM2/3/10
to nhiber...@googlegroups.com
Em muitos casos, totalmente inviável :)

Diogo Menezes

unread,
Feb 3, 2010, 2:32:43 PM2/3/10
to nhiber...@googlegroups.com
Exato rafael, imagine atualizas excluir 500.000 registros dando delete 1 a 1 por foreach !!! Tosco.... sem contar o tamanho do objeto que teria a lista na memória.

Jan Limpens

unread,
Feb 3, 2010, 3:34:20 PM2/3/10
to nhiber...@googlegroups.com
nh tem suporte para um feature chamado batches. ajuda bastante nesses casos. de qualquer forma não é a ferramenta certa para bulk operations....

2010/2/3 Diogo Menezes <diogol...@gmail.com>



--
Jan
Reply all
Reply to author
Forward
0 new messages