【问题标题】:Exception in setArray() in HSQLHSQL 中的 setArray() 异常
【发布时间】:2021-01-05 20:59:19
【问题描述】:

我在单元测试中使用 HSQL 作为 EmbeddedDatabaseType。我已经使用这个查询创建了一个表:

CREATE TABLE Table1 (array1 VARCHAR(256) ARRAY, obj1 VARCHAR(256) ); 

这是 upsert 查询:

MERGE INTO Table1 USING (VALUES ?, ?) vals(array1, obj1) 
ON Table1.obj1 = vals.obj1 
WHEN MATCHED THEN 
UPDATE SET Table1.array1 = vals.array1 
WHEN NOT MATCHED THEN 
INSERT (array1, obj1) VALUES (vals.array1, vals.obj1); 

这是 PreparedStatementSetter:

private static ParameterizedPreparedStatementSetter<data> preparedStatementSetter() {
    return (preparedStatement, data) -> {           
        JDBCArrayBasic array = new JDBCArrayBasic(data.getY(), type);
        preparedStatement.setArray( 1,  array);
        preparedStatement.setString( 2, data.getX() );
    };
}

我正在尝试将一个数组写入数据库,但它给了我这个异常:

Caused by: java.sql.SQLSyntaxErrorException: incompatible data type in conversion
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCPreparedStatement.setArray(Unknown Source)

谁能告诉我这里缺少什么?

【问题讨论】:

    标签: jdbc hsqldb


    【解决方案1】:

    MERGE 语句无法确定 USING 子句中参数的类型。您只需将参数转换为预期的数据类型。

    MERGE INTO Table1 USING (VALUES CAST(? AS VARCHAR(256) ARRAY), CAST(? AS VARCHAR(256))) 
    vals(array1, obj1) ON ...
    

    在第二个参数的情况下,参数默认为 VARCHAR,但最好明确说明类型是什么。

    在 INSERT、SELECT、UPDATE 和 DELETE 语句中,参数的类型通常由数据库引擎确定,而不使用 CAST。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-11
      • 2015-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多