使用MySQL和使用JDBC模板,有没有办法从Java列表构建参数,以便 SQL请求与给定集合中的一对值匹配几个值< /强>
仅当列表中存在两对值时,这些值才匹配。
如果一个值存在于几个值中,而另一个夫妻中的另一个进一步进入夫妻列表,则不匹配。
也就是说,鉴于JDBC参数化查询:
SELECT *
FROM TABLE_1
WHERE (COL_1, COL_2) IN (:valuesSet)
警告:valuesSet是一组情侣
那个Java代码:
public void daoMethod(List<MyObject> values1, List<MyObject> values2) {
String query = "";
query = "SELECT *\n" +
"FROM TABLE_1\n" +
"WHERE (COL_1, COL_2) IN (:valuesSet)";
MapSqlParameterSource parameters = new MapSqlParameterSource();
// Build valuesSet here
parameters.addValue("valuesSet", valuesSet);
namedParameterJdbcTemplate.query(query, parameters);
}
是否有一种优雅的方法来构建JDBC模板而无需“手动”创建字符串?
插入的:valuesSet
应该是这样的:
"(values1.get(0), values2.get(0)), (values1.get(1), values2.get(1)), ..."
但是我应该如何构建该字符串?
目前,我的第一个解决方案是使用Java代码构建字符串,如下所示:
List<String> valuesSet = new ArrayList<String>();
for (int i = 0; i < values1.size(); i++) {
String value1 = StringEscapeUtils.escapeSql(values1.get(i).toString());
String value2 = StringEscapeUtils.escapeSql(values2.get(i).toString());
valuesSet.add("('" + value1 + "','" + value2 + "')");
}
但它不断转义结果列表使其成为一个字符串并在其周围添加'
。因此,它不起作用。
输入:
List<Object> objects
输出:
SELECT *
FROM TABLE_1
WHERE (COL_1, COL_2) IN (
('object_1_val1', 'object_1_val2'),
('object_2_val1', 'object_2_val2'),
('object_3_val1', 'object_3_val2'),
('object_4_val1', 'object_4_val2'),
...
)
平均:
NamedParameterJdbcTemplate
答案 0 :(得分:1)
分别使用每个值。
List<String> valuesSet = new ArrayList<>();
StringBuilder sqlIn = new SqlBuilder();
for (int i = 0; i < values1.size(); i++) {
sqlIn.append("(?, ?),");
valuesSet.add(values1.get(i).toString());
valuesSet.add(values2.get(i).toString());
}
答案 1 :(得分:0)
我使用 CONCAT():
找到了解决方法SELECT *
FROM TABLE_1
WHERE CONCAT(COL_1, ',', COL_2) IN (:valuesSet);
这样,valuesSet可以是一个简单的字符串列表,并按以下方式传递:
List<String> valuesSet = new ArrayList<String>();
for (int i = 0; i < values1.size(); i++) {
String value1 = StringEscapeUtils.escapeSql(values1.get(i).toString());
String value2 = StringEscapeUtils.escapeSql(values2.get(i).toString());
valuesSet.add(value1 + "," + value2;
}
parameters.addValue(“valuesSet”,valuesSet);
然后,执行的查询类似于:
SELECT *
FROM TABLE_1
WHERE CONCAT(COL_1, ',', COL_2) IN (
'object_1_val1,object_2_val1',
'object_1_val2,object_2_val2',
'object_1_val3,object_2_val3',
'object_1_val4,object_2_val4',
...
);