【问题标题】:Java SQL Query - value pair parameterJava SQL 查询 - 值对参数
【发布时间】:2020-08-10 10:15:01
【问题描述】:

我希望选择两列成对的数据。

我有一个有效的 MySQL 查询:

SELECT t.whatever 
FROM t 
  JOIN 
    ( VALUES (val1a, val2a), (val1b, val2b), ...) AS x (col1, col2)
      ON  x.col1 = t.col1
      AND x.col2 = t.col2 ;

但是当我尝试在带有参数的 Java 中使用它时,我无法让它工作。这是我尝试过的:

@Query(value = "SELECT t.whatever FROM t JOIN (VALUES (?1) AS x (col1, col2) ON  x.col1 = t.col1 AND x.col2 = t.col2 ;", nativeQuery = true)
    List<Whatever> findByPair(List<List<String>> PairString);

我收到以下错误:“x”的列多于列列表中指定的列

其中 PairString 是字符串列表的列表,例如:
[[val1a, val2a], [val1b, val2b], [val1c, val2c], [val1d, val2d]]

【问题讨论】:

  • 我删除了 Microsoft SQL Server 标签 (sql-server) 并添加了 MySQL (mysql),因为您的问题只是关于 MySQL。

标签: java mysql sql


【解决方案1】:

我认为在 Java 中使用 Pair/Tuple 将是一个解决方案: @见https://www.baeldung.com/java-pairs

如果您不想添加依赖项,POJO 类将处理您拥有的 ResultSet。我认为这是最好的选择:

public class CustomPair {
    private String key;
    private String value;
     
    // standard getters and setters
}

上一个答案: 也许在SO here 上找到的 SQL 请求将正确处理您的需求。 当然,您必须调整 SQL 相关部分以匹配您的模型和您的需要:

SELECT p.* 
FROM products p
LEFT JOIN (SELECT product_ID, count(Distinct filter_ID) cnt
           FROM products_Filter
           WHERE (Filter_ID = 1 and filter_value = 1)
              or (Filter_ID = 3 and filter_value = 0)
           GROUP BY Product_ID) pf
   on P.Product_ID = PF.Product_ID
 WHERE pf.cnt = 2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    相关资源
    最近更新 更多