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

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

我做错了什么!?

提前致谢

有帮助吗?

解决方案

你应该传递一个列表。

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注入. 。如果您使用参数,则提供此保证。如果您使用参数构建查询字符串,则必须为自己提供此保证......!

其他提示

您必须传递字符串,而不是一个字符串列表。 JPA不分析你的价值观,你必须自己分割。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top