我正在试图找出一种方法来创建一个JPQL查询,我可以传递一个map(键和值)列表。查询的参数示例:
Map<String, String> personCodeAndDocumentNumber;
personCodeAndDocumentNumber.put("123", "123123123");
personCodeAndDocumentNumber.put("456", "ASD45345");
并传递此值以找到它们,生成如下SQL:
SELECT p FROM person p
JOIN document d ON d.pessoa_id = p.id
WHERE (p.code = '123' AND d.number = '123123123')
OR (p.code = '456' AND d.number = 'ASD45345')
这张地图可以有很多值。
一个possible alternative可能正在使用IN
子句,但我认为这只适用于同一个表中的列。例如:
SELECT *
FROM table_name
WHERE (key_part_1, key_part_2) IN ( ('B',1), ('C',2) );
我知道这样做的唯一方法是连接JPQL字符串并直接在JPQL上添加值,但我很容易受到SQL注入这样做:
String s = "SELECT p FROM Person p ";
+ "JOIN p.document d ";
+ "WHERE ";
for (Entry<String, String> entry = personCodeAndDocumentNumber.entrySet()) {
s += "(p.code = '" + entry.getKey() + "' AND d.number = '" + entry.getValue() + "') ";
s += "OR ";
}
我知道我可以使用一些escape
方法处理条目值而不易受SQL注入攻击,但我希望找到一种更好的方法来实现这一点。有任何想法吗?