使用map(key,value)列表作为带OR条件的参数创建JPQL(或Criteria)

时间:2018-06-15 20:02:43

标签: hibernate jpql criteria

我正在试图找出一种方法来创建一个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注入攻击,但我希望找到一种更好的方法来实现这一点。有任何想法吗?

0 个答案:

没有答案