7

我试图在我的查询中设置一个参数,例如:

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')

我做错了什么!?

提前致谢

4

2 回答 2

14

你应该通过一个列表。

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);

作为一般规则,通常更喜欢将参数传递给固定查询,而不是自定义字符串。优点可能是:

  1. 减少解析:JPA 实现(至少是 Hibernate)在解析每个查询时都很费力。因此,解析后的查询进入缓存,以供重用。如果查询字符串是在运行时从参数构建的,它可能永远不会重复两倍,因此会损失大量时间、计算能力和缓存内存。但是,如果您使用具有不同参数的相同查询字符串,宾果游戏:速度快、内存使用量低、cpu 要求低。
  2. 防止 SQL 注入。如果您使用参数,则提供此保证。如果您使用参数构建查询字符串,则必须为自己提供此保证...!
于 2009-12-22T16:24:07.130 回答
2

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

于 2009-12-22T16:23:42.950 回答