Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Duvida com namedQueries

Estou com uma duvida, o meu namedQueries, eu uso na minha classe bean? e poderiam ver se esta correto o modo de uso?

@ManagedBean
@ViewScoped
@NamedQueries({@NamedQuery(name = "ClienteController.listarTodos", query = "Select c from Cliente c")})
public class ClienteController  implements Serializable{

No meu DAO especifico fico assim.

public class ClienteDAO {

    public List<Cliente> listarTodos() {
        EntityManager em = new JPAUtil().geEntityManager();
        Query query = em.createNamedQuery("ClienteController.listarTodos");
        List<Cliente> resultList = query.getResultList();
        em.close();
        return resultList;
    }
}

Agora não sei se o meu namedQueries fica no meu bean ou na minha classe Cliente mesmo. E também dentro no meu DAO, tenho um metodo do tipo list, mais la eu estou fazendo assim.

Query query = em.createNamedQuery("ClienteController.listarTodos");

seria createNamedQuery mesmo? porque eu ja criei na minha classe Bean, esta o codigo todo certo? Se tiver errado oque alterar?

7 respostas
solução!

Fala amigo, é assim mesmo.

Basicamente você delega a responsabilidade de guardar a query para a classe de domínio, assim o código fica mais limpo.

Na minha opinião, esse recurso deve ser usado mais para queries complexas pois o código de sql na classe de domínio despolui a classe DAO. Nesse caso onde apenas é feita a listagem você poderia manter a query no DAO.

Seu código deu erro? Aparentemente está tudo certo, se deu poste o erro. Abraço!

Referência: http://javasemcafe.blogspot.com.br/2011/04/jpa-20-utilizando-os-namedquery.html

Danyllo entao eu uso sempre no meu bean? e nao no classes do tipo modelo? Entendeu oque quiz dizer né? E eu olhei o blog que você me mando e quando vi fiquei com uma duvida, e pelo oque vi você e experiente e ira saber respoder kkkkk. Quando se faz uma buscar por id, você tem que passar um codigo"id" para saber quem você esta buscando, depois quando você faz a sua query por exemplo assim.

query = "Select c from Cliente c where c.codigo = codigo"

depois do sinal do igual, está apenas codigo, e na alura vi um curso que era assim. :pCodigo ficando assim seu codigo.

query = "Select c from Cliente c where c.codigo = :pCodigo"

Qual a diferença? ou é apenas sintatexe? Desde ja muito obrigado!!

Alias Danyllo o metodo find já não tem essa funcionalidade? agora pensando aqui lembrei do find, agora que bugou tudo mesmo minha mente kkkkkkkkkkkkk

Isso Alisson, exatamente. Existem as duas possibilidades cada uma com sua peculiaridade. Assim as mesmas são implementadas de forma diferente. Ex (namedQuerie):

Query query = em.createNamedQuery("Cliente.recuperarPorCodigo");
query.setParameter("codigo", codigo);
return query.getResultList();
@NamedQuery(name = "Cliente.recuperarPorCodigo", query = "Select c from Cliente c where c.codigo = :pCodigo "

Ex (querie DAO):

String sql = query = "Select c from Cliente c where c.codigo = ?1";
Query query = em.createNativeQuery(queryString);
query.setParameter(1, codigo);
query.getResultList();

No caso do find:

Cliente cliente = em.find(Cliente.class, codigo );

Existem várias possibilidades, todas levam ao mesmo resultado, basta escolher uma delas! rs

No meu caso, eu prefiro colocar tudo relacionado a queries dentro do DAO.

Muito obrigado mano, no seu caso você prefere usar o find que é muito mais pratico né? e nao precisa ficar fazendo select né? Ou da maneira de que a gente viu no blog que você me passo?

Particularmente prefiro o find, essas namedQueries dói a alma ahhahahahaha O blog só foi uma referência mesmo. Bons estudos!! Abraço!

Muito obrigado Danyllo, abraçoos