Criteria JPA 2.0

Prezados, estava eu usando Criteria/JPA com um só critério para Teste da seguinte forma:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery cq = cb.createQuery(Usuario.class);
Root<Usuario> root = cq.from(Usuario.class);
EntityType<Usuario> modelo = root.getModel();

cq.where(cb.equal(root.get(modelo.getSingularAttribute("login",String.class)),login));        

Porém, agora quero fazer com mais de 1 atributo… O que estou fazendo de errado… ??? tem um exemplo na Doc do OpenJPA que mostra como fazer um MetaModel pra poder usar… mas sério, isso é muito sem noção (pelo menos ainda não ví sentido nisso)… Porque que eles não procuram facilitar as coisas… ??? PQP… As vezes irrita…

OpenJPA: http://openjpa.apache.org/builds/latest/docs/manual/jpa_overview_criteria.html (porém tem esse MetaModel que me recuso a fazer)

Não sei mais o que fazer…

Tem um getPluralAttribute() mas me retorna um Set… é ele que tenho que usar ???

Abraços :wink:

No inicio JPA Criteria parece complicado… mas depois que você usa acaba notando que ela é robusta ao invés de complicado.

Mas enfim… você não precisa usar metamodel para fazer criteria de mais de um atributo. O esquema do metamodel é que você possa trabalhar com tipagem ao invés de passar Strings. Um exemplo: no Hibernate Criteria vocẽ pode fazer beetwhen de dois campos String que ele vai aceitar, já no JPA ele só deixara objetos temporais (date, calendar).

O código fica um pouco mais extendo que se você usasse Hibernate Criteria ou JPQL, mas fica bem mais legível.

No seu caso, se vocẽ quer filtrar a consulta por login e grupo, por exemplo, dá para alterar a linha 6 por:

Predicate byLogin = builder.equal(root.get("login"), login); Predicate byGroup = builder.equal(root.get("group"), group); c.where(byLogin, byGroup);

Essa criteria do JPA fico uma droga, se foi toda a legibilidade, agora é necessario escrever um codigo sofrivel pra não ganhar nada?

Eu espera algo mais, a do Hibernate é simplista, agora a do JPA eles esquecem de um certo conceito KISS, eu ainda prefiro escreveu meu EJBQL, do que usar essa bagaça ai…

[quote=garcia-jj]No inicio JPA Criteria parece complicado… mas depois que você usa acaba notando que ela é robusta ao invés de complicado.

Mas enfim… você não precisa usar metamodel para fazer criteria de mais de um atributo. O esquema do metamodel é que você possa trabalhar com tipagem ao invés de passar Strings. Um exemplo: no Hibernate Criteria vocẽ pode fazer beetwhen de dois campos String que ele vai aceitar, já no JPA ele só deixara objetos temporais (date, calendar).

O código fica um pouco mais extendo que se você usasse Hibernate Criteria ou JPQL, mas fica bem mais legível.

No seu caso, se vocẽ quer filtrar a consulta por login e grupo, por exemplo, dá para alterar a linha 6 por:

Predicate byLogin = builder.equal(root.get("login"), login); Predicate byGroup = builder.equal(root.get("group"), group); c.where(byLogin, byGroup);[/quote]

Realmente, eu to com a cabeça Web no momento… heueheuehueheueheueehu, com certeza deve ter o seu campo de ação…

garcia-jj vou testar o que você me passou e assim que resolver, posto o resultado aqui…

Só o que eu fiquei fulo da vida é que não achei esse uso do Predicate em lugar nenhum… enfim… vivendo e aprendendo, quem sabe futuramente não começo a gostar do MetaModel… heheh

Valews 8)

Meus amigos, funcionou perfeitamente…

Muito obrigado pelos Helps.

Só uma questão a mais, pra fechar o tópico… tem como ver essa Query no Debug do NB ou através de algum método ??? Ou terei que implementar o Log4J ??

Abs []

A parte de logging da query é feita pelo JPA provider, sendo assim cada um faz de uma forma. Eclipselink usa o java.util.logging, já o Hibernate usa o SLF4J.