[RESOLVIDO] Como criar novas NamedQueries?

Tenho as seguintes NamedQueries (entre outras) na minha classe Usuario.

@NamedQueries({ @NamedQuery(name = "Usuario.findAll", query = "SELECT u FROM Usuario u"), @NamedQuery(name = "Usuario.findByLoginUsu", query = "SELECT u FROM Usuario u WHERE u.loginUsu = :loginUsu"), @NamedQuery(name = "Usuario.findBySenhaUsu", query = "SELECT u FROM Usuario u WHERE u.senhaUsu = :senhaUsu"), })

Gostaria de inserir mais uma que fizesse a validação via MD5 da senha do usuario. Em minha concepção seria ficaria assim:

@NamedQueries({ @NamedQuery(name = "Usuario.loginESenhaMD5", query = "SELECT u FROM Usuario u WHERE u.loginUsu = :loginUsu AND u.senhaUsu = MD5(':senhaUsu')"), @NamedQuery(name = "Usuario.findAll", query = "SELECT u FROM Usuario u"), @NamedQuery(name = "Usuario.findByLoginUsu", query = "SELECT u FROM Usuario u WHERE u.loginUsu = :loginUsu"), @NamedQuery(name = "Usuario.findBySenhaUsu", query = "SELECT u FROM Usuario u WHERE u.senhaUsu = :senhaUsu"), })

Mas ao modificar qualquer dado dentro das Aspas ele retorna erro e a entidade da erro ao ser criada. Dentro da classe ele da erro de MD5:

Usuario.loginESenhaMD5[70;73]: The identification variable 'MD5' is not defined in the FROM clause.

se eu deixar assim: ele funciona normalmente

@NamedQueries({ @NamedQuery(name = "Usuario.loginESenhaMD5", query = "SELECT u FROM Usuario u WHERE u.loginUsu = :loginUsu"), @NamedQuery(name = "Usuario.findAll", query = "SELECT u FROM Usuario u"), @NamedQuery(name = "Usuario.findByLoginUsu", query = "SELECT u FROM Usuario u WHERE u.loginUsu = :loginUsu"), @NamedQuery(name = "Usuario.findBySenhaUsu", query = "SELECT u FROM Usuario u WHERE u.senhaUsu = :senhaUsu"), })

Alguém pode me indicar como criar novas NamedQueries?

Ninguem?

Preciso colocar uma checagem MD5 dentro da query ali, alguem ajuda?

O MD5 não existe para ser referenciado, por isso a exception.
Tente alguma coisa +/- assim:

 @NamedQuery(name = "Usuario.loginESenhaMD5", query = "SELECT u FROM Usuario u WHERE u.loginUsu = :loginUsu AND u.senhaUsu = :=md5")
Usuario usuario = em.createNamedQuery("Usuario.loginESenhaMD5")
   .setParameter("MD5", md5);

Abs!

Mas ele não será referenciado mesmo. MD5 é uma função do MySQL
preciso passar para o banco de dados processar.

[quote=rcmatias]Mas ele não será referenciado mesmo. MD5 é uma função do MySQL
preciso passar para o banco de dados processar.[/quote]

Verdade cara!

Não tenho certeza, mas acho que não é possível chamar uma function usando @NamedQuery. Vc vai precisar usar @NamedNativeQuery.

Abs!

[quote=freakazoid]
Não tenho certeza, mas acho que não é possível chamar uma function usando @NamedQuery. Vc vai precisar usar @NamedNativeQuery.

Abs![/quote]

Beleza, se tem outra função vou pesquisar sobre…

Vou verificar aqui.

abs

[quote=freakazoid]
Verdade cara!

Não tenho certeza, mas acho que não é possível chamar uma function usando @NamedQuery. Vc vai precisar usar @NamedNativeQuery.

Abs![/quote]

Não achei nada ainda sobre como implementar o namednativequery, sou iniciante java e to meio perdido. Será que alguem teria algum link com material?

http://www.java2s.com/Code/Java/JPA/UsingNamedNativeQuery.htm

http://www.codemiles.com/jpa/named-native-query-t6203.html

Cara se for possível não faça essas gambiarras, usa mapeamento por XML (sei que é chato, mas é a única alternativa decente do Hibernate pra Java). Deixe o SQL longe das suas entidades. Exemplo: http://docs.jboss.org/hibernate/orm/3.3/reference/pt-BR/html/querysql.html#querysql-namedqueries Mas se não for possível siga o exemplo que o freakazoid passou.

Ao invés de usar o uma query para checar a sua MD5, utilize um algoritmo para checar a sua md5 que esta no banco e com a md5 gerada no password que o usuario digitou.

Fiz exatamente o que o andrielc disse…

Mas vou precisar de novas namedqueries ou então terei que ficar criando com createquery, mas tudo bem.

Vou pesquisar aqui, marcando o tópico como resolvido.