处理“NOT IN(:param)”时的JPA setParameter

时间:2009-12-22 16:05:23

标签: java jpa named-query

我正在尝试在查询中设置参数,例如:

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

当我在我的JavaClass中添加参数时,就像:

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

这不起作用,只使用只有一个参数 我试过"'RED','BLUE'" 并没有努力。

如果我将查询中的参数放在例如:

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

我做错了什么!?

提前致谢

2 个答案:

答案 0 :(得分:13)

你应该传递一个List。

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.

你也可以这样做:

query.setParameter("color_params", colors);

作为一般规则,通常优先将参数传递给固定查询,而不是自定义String。优点可能是:

  1. 减少解析:JPA实现(至少是Hibernate)解析每个查询都很辛苦。因此,解析的查询进入缓存,以便重用。如果查询字符串是在运行时从参数构建的,那么它可能永远不会是两次相同,因此会丢失大量的时间,计算能力和高速缓存。但是如果你使用不同参数的相同查询字符串,bingo:快速,低内存使用,低cpu要求。
  2. 防止SQL注入。如果使用参数,则提供此保证。如果使用参数构建查询字符串,则必须为自己提供此保证......!

答案 1 :(得分:1)

您必须传入字符串列表,而不是单个字符串。 JPA不会解析您的值,您必须自己拆分它们。