【问题标题】:Calling query having multiple IN Clause from JAVA从 JAVA 调用具有多个 IN 子句的查询
【发布时间】:2016-02-12 15:17:13
【问题描述】:

此查询在 SQL Developer 中运行良好:select * from MYTABLE where (field1, field2) IN (('A', '1'), ('B','2'), ('C','3')) ;

但是当我尝试从 java 调用它时,我遇到了异常。

public List<MYVO> callDB(List<String> sourceAndIdList) {
        System.out.println(sourceAndIdList);
        String query = "select * from MYTABLE where (field1, field2) IN (:source_monitorId_list)";
        Map<String, List<String>> namedParameters = Collections.singletonMap("source_monitorId_list", sourceAndIdList);
        return this.namedParameterJdbcTemplate.query(query , namedParameters, new RowMapper<MYVO>() {
            @Override
            public MYVO mapRow(ResultSet rs, int rowNum) throws SQLException {
                ....
            }
        });
    }

打印我得到的列表:[('A', '1'), ('B', '2'), ('C', '3')]

例外:

严重:Servlet.service() 用于 servlet [selfservice] 在上下文中 路径 [/mymonitoring] 抛出异常 [请求处理失败; 嵌套异常是 org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback;糟糕的 SQL 语法 [select * from MYTABLE 其中(field1,field2)IN(?,?,?)];嵌套异常是 java.sql.SQLSyntaxErrorException: ORA-00920: 无效的关系 operator ] 的根本原因是 java.sql.SQLSyntaxErrorException: ORA-00920: 无效的关系运算符


编辑:这不是重复的,因为我正在为具有多个 IN 子句的查询寻找带有弹簧 NamedParameterJdbcTemplate 的解决方案,并且参数的大小仅在运行时才知道。

【问题讨论】:

  • 这个问题有一个新的方面在另一个方面没有得到回答。这是关于参数的嵌套映射。 PreparedStatement 的参数的重要方面是列表是扁平的。只接受可直接映射到 SQL 类型的对象。

标签: java sql spring oracle named-parameters


【解决方案1】:

您不能在“IN”中使用这样的绑定参数。

要么你做:

IN ((:p1, :p2), (:p3,:p4), (:p5,:p6))

但它假设您确切知道您有多少项目(在本例中为 3),或者您在 SQL 字符串中“具体化”了您的参数:

String query = "select * from MYTABLE where (field1, field2) IN (('A', '1'), ('B', '2'), ('C', '3'))";

【讨论】:

  • 您的表达式 IN (:p1, :p2, p3) 中有错字。缺少最后一个冒号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-23
  • 1970-01-01
相关资源
最近更新 更多