JPA setParameter 处理“NOT IN (:param)”时
-
20-09-2019 - |
题
我正在尝试在查询中设置一个参数,例如:
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);
作为一般规则,通常更喜欢将参数传递给固定查询,而不是自定义字符串。优点可能是:
- 减少解析:JPA 实现(至少是 Hibernate)需要努力解析每个查询。因此,解析后的查询会进入缓存以供重用。如果查询字符串是在运行时根据参数构建的,则它可能永远不会两次相同,因此会损失大量时间、计算能力和缓存内存。但如果您使用具有不同参数的相同查询字符串,宾果:速度快,内存占用低,CPU 要求低。
- 防止SQL注入. 。如果您使用参数,则提供此保证。如果您使用参数构建查询字符串,则必须为自己提供此保证......!
其他提示
您必须传递字符串,而不是一个字符串列表。 JPA不分析你的价值观,你必须自己分割。
不隶属于 StackOverflow