EJBQL NamedQuery Dinamica?

5 respostas
A

Olá pessoal… alguem sabe se existe um modo de fazer uma query “dinamica”, onde somente os dados que eu passar ele ira testar…???

exemplo:

SELECT u FROM Usuarios u WHERE u.nome=?1 AND u.nasc=?2 AND u.cidade=?3 AND etc...

De modo que se eu passar apenas o primeiro item(?1), somente ele será analisado.
Ou se eu não passar nenhum item… nenhum será analisado, retornando todos os dados.

Pelo que eu li na doc da sun, os parametros devem ser passados na msm ordem dos numeros ?n, isso quer dizer que não é possível fazer isso??? (tem que melhorar entao)

Se pudesse fazer algo semelhante a isso, seria mto melhor:

SELECT u FROM Usuarios [ WHERE [ u.nome=?1 AND ] [ u.nasc=?2 AND ] [ u.cidade=?3 AND ] etc... ]

Será que existe algo que eu possa fazer para não ficar escrevendo muitas @NamedQuerys pra fazer isso?
[color=green](Sem usar um metodo java para construcao dinamica de uma query)[/color]

[color=darkblue]Obs: algumas pessoas dizem que é possível substituir os DAOs pelo EntityManager e as NamedQuerys, mass… se eu não conseguir fazer o que acima foi falado (ou algo semelhante)… porque eu iria descartar minhas DAOs? - sendo que os metodos delas que cuidam da construcao do SQL. :?[/color]

5 Respostas

Mauricio_Linhares

Não, não dá pra fazer isso, tem que sair colando o SQL na mão mesmo.

A

já imaginava msm… :frowning:
valeu…

LuizAvila
SELECT u 
   FROM Usuarios u 
 WHERE (u.nome=?1 OR ?1 is null) 
     AND (u.nasc=?2 OR ?2 is null)
     AND (u.cidade=?3 OR ?3 is null)
     AND etc...

Dessa maneira para o parametro que vc nao quer considerar passe ele com o valor null.

Fiz alguns testes e até onde fui nao degradou muito a performance.

Desvantagem é que vc sempre vai ter que passar todos os parametros.

Vantagem, vc aproveita o esquema de cache das queries, no caso de query concatenada para cada valor que vc concatenar ele vai cachear uma query nova

A

hmm… essa é uma boa saida… :smiley:

mas é o que vc disse… todos parametros devem ser passados…
o meu codigo java que chama esta namedquery podera ficar imenso dependendo do numero de campos que tenho.
e buscas por campos nulos também não iria funcionar…

mas eh uma boa ideia.
valeu…

A

bom… aproveitando o topico vou colocar mais questao aqui…

O que ficaria melhor ao usar uma NamedQuery??
@NamedQuery, ou estatica em uma classe?

@Entity
@Table(schema = "dbo")
@NamedQuery(name="users.findByName", query="Select u from Usuarios where u.nome=?1")
public class Usuarios implements Serializable {
}
...
//Chamando a namedQuery
Usuarios users = em.createNamedQuery("users.findByName").setParameter(1,"Tony");

ou

@Entity
@Table(schema = "dbo")
public class Usuarios implements Serializable {
     public static final String findByName = "Select u from Usuarios where u.nome=?1";
}	
//Chamando a namedQuery
Usuarios users = em.createQuery(Usuarios.findByName).setParameter(1,"Tony");

sendo que na segunda opcao as querys disponiveis podem ser encontradas utilizando a classe usuarios. Isso ajudaria tbm a refatoracao e localizacao de variaveis.

Pra mim, a segunda parece um bom modo para obter ajuda da IDE em implementacao de codigo, e refatoracao.

Criado 8 de fevereiro de 2008
Ultima resposta 8 de fev. de 2008
Respostas 5
Participantes 3