Pergunta

Estou tentando definir um parâmetro em minha consulta, por exemplo:

select * from Cars where Cars.color NOT IN (:color_params)

E quando estou adicionando o parâmetro no meu javaclass é como:

...
query.setParameter("color_params", "RED,BLUE");
...

E isso não está funcionando, está apenas trabalhando com Apenas um parâmetro.
Eu tentei com "'RED','BLUE'"e não está trabalhando para.

Se eu colocar meus parâmetros na consulta, está funcionando, por exemplo:

select * from Cars where Cars.color NOT IN ('RED','BLUE')

O que estou fazendo de errado!?

desde já, obrigado

Foi útil?

Solução

Você deveria passar por uma lista.

List<String> colors = ....;
String query = "select * from Cars where Cars.color NOT IN (:color_params)";
Map<String, Object> params = new HashMap<String, Object>();
params.put("color_params", colors);
// ... execute the query with the param.

Você também pode fazer:

query.setParameter("color_params", colors);

Como regra geral, é frequentemente preferido passar parâmetros para uma consulta fixa, em vez de personalizar a string. As vantagens podem ser:

  1. Análise reduzida: A implementação da JPA (pelo menos Hibernate) tem um trabalho duro analisando cada consulta. Portanto, a consulta analisada entra em cache, para ser reutilizada. Se a sequência de consulta for construída em tempo de execução a partir de parâmetros, pode nunca ser o dobro da mesma, então muito tempo, a potência de computação e a memória de cache serão perdidos. Mas se você usar a mesma string de consulta com parâmetros diferentes, Bingo: Uso rápido e baixo de memória, requisito baixo da CPU.
  2. Impedir a injeção de SQL. Esta garantia é oferecida se você usar parâmetros. Se você construir sua sequência de consultas com os parâmetros, precisará fornecer esta garantia ...!

Outras dicas

Você deve passar em uma lista de strings, não uma única string. O JPA não analisa seus valores, você deve dividi -los você mesmo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top