MySQL:如何通过JDBC将一对值约束成一对值?

时间:2016-04-14 13:12:22

标签: java mysql jdbc

问题

使用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 + "')");
}

但它不断转义结果列表使其成为一个字符串并在其周围添加'。因此,它不起作用。

TL; DR

输入:

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

2 个答案:

答案 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',
    ...
);