6

私は Spring JdbcTemplate を使用していますが、実際には int の配列である列を更新するクエリがある時点で立ち往生しています。データベースは postgres 8.3.7 です。これは私が使用しているコードです:

public int setUsersArray(int idUser, int idDevice, Collection<Integer> ids) {

    int update = -666;

    int[] tipi = new int[3];
    tipi[0] = java.sql.Types.INTEGER;
    tipi[1] = java.sql.Types.INTEGER;
    tipi[2] = java.sql.Types.ARRAY;

    try {
        update = this.jdbcTemplate.update(setUsersArrayQuery, new Object[] {
                ids, idUser, idDevice }, tipi);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return update;
}

クエリは「update table_name set array_column = ? where id_user = ? and id_device = ?」です。私はこの例外を受け取ります:

org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [更新 acotel_msp.users_mau set denied_sub_client = ? id_users = ? id_mau = ?]; 列インデックスが範囲外です: 4、列数: 3.; ネストされた例外は org.postgresql.util.PSQLException: The column index is out of range: 4, number of columns: 3.

原因: org.postgresql.util.PSQLException: 列インデックスが範囲外です: 4、列数: 3。

春のjdbcテンプレートドキュメントを調べましたが、助けが見つかりません。探し続けます。とにかく誰かが私を正しい方向に向けることができますか? ありがとう!

編集 :

明らかに順序が間違っていました、私のせいです...

私はあなたの両方のソリューションを試しましたが、最初のケースではこれがありました:

org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; 不適切な SQL 文法 [update users set denied_sub_client = ? id_users = ? id_device = ?]; ネストされた例外は org.postgresql.util.PSQLException です: java.util.ArrayList のインスタンスを Types.ARRAY 型にキャストできません

私がこれを持っていた2番目の解決策を試してみてください:

org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; 不適切な SQL 文法 [update users set denied_sub_client = ? id_users = ? id_device = ?]; ネストされた例外は org.postgresql.util.PSQLException: Cannot cast an instance of [Ljava.lang.Object; です。タイプTypes.ARRAYに

java.sql.Array のインスタンスが必要だと思いますが、JdbcTemplate を使用して作成するにはどうすればよいですか?

4

7 に答える 7

4
private static final String ARRAY_DATATYPE = "int4";
private static final String SQL_UPDATE = "UPDATE foo SET arr = ? WHERE d = ?";
final Integer[] existing = ...;
final DateTime dt = ...;

getJdbcTemplate().update(new PreparedStatementCreator() {
    @Override
    public PreparedStatement createPreparedStatement(final Connection con) throws SQLException {
        final PreparedStatement ret = con.prepareStatement(SQL_UPDATE);
        ret.setArray(1, con.createArrayOf(ARRAY_DATATYPE, existing));
        ret.setDate(2, new java.sql.Date(dt.getMillis()));
        return ret;
    }
});
于 2011-01-11T09:40:49.233 に答える
3

このソリューションは、postgreSQL 組み込み関数を使用した一種の回避策であり、私にとっては間違いなく機能しました。

参考ブログ

1) 文字列配列をコンマ区切り文字列に変換する

Java8 を使用している場合は、非常に簡単です。その他のオプションはこちら

String commaSeparatedString = String.join(",",stringArray); // Java8 feature

2) PostgreSQL 組み込み関数 string_to_array()

ここで他のpostgreSQL配列関数を見つけることができます

// tableName ( name text, string_array_column_name text[] )

String query = "insert into tableName(name,string_array_column_name ) values(?, string_to_array(?,',') )";


int[] types = new int[] { Types.VARCHAR, Types.VARCHAR};

Object[] psParams = new Object[] {"Dhruvil Thaker",commaSeparatedString };

jdbcTemplate.batchUpdate(query, psParams ,types); // assuming you have jdbctemplate instance
于 2016-09-06T20:28:37.560 に答える
1

http://valgogtech.blogspot.com/2009/02/passing-arrays-to-postgresql-database.htmlは java.sql.Array postgresql の作成方法を説明しています。基本的に Array.getBaseTypeName は int を返し、Array.toString は配列を返す必要があります。 「{1,2,3}」形式のコンテンツ

配列を作成した後、PreparedStatementCreator からの preparestatement.setArray (...)を使用して設定できます。

jdbcTemplate.update(
    new PreparedStatementCreator() {
        public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {

幸運を ..

于 2009-11-12T18:39:53.150 に答える
1

これまでに見つけた最もクリーンな方法は、最初に を に変換CollectionInteger[]、次に を使用してそれConnectionを に変換することArrayです。

Integer[] idArray = ids.toArray(new Integer[0]);

Array idSqlArray = jdbcTemplate.execute(
        (Connection c) -> c.createArrayOf(JDBCType.INTEGER.getName(), idArray)
);

update = this.jdbcTemplate.update(setUsersArrayQuery, new Object[] {
                            idSqlArray, idUser, idDevice })

これは、ドキュメントの情報に基づいています: https://jdbc.postgresql.org/documentation/head/arrays.html

于 2019-02-01T06:59:21.977 に答える
1

引数の型と引数が一致しません。

引数の型順を変えてみてください

int[] tipi = new int[3];
tipi[0] = java.sql.Types.ARRAY;
tipi[1] = java.sql.Types.INTEGER;
tipi[2] = java.sql.Types.INTEGER;

または使用

update = this.jdbcTemplate.update(setUsersArrayQuery, new Object[] {
                                ids.toArray(), idUser, idDevice })

そして、それが機能するかどうかを確認します

于 2009-11-11T15:15:16.580 に答える
-1
java.sql.Array intArray = connection.createArrayOf("int", existing);
List<Object> values= new ArrayList<Object>();
values.add(intArray);
values.add(dt);
getJdbcTemplate().update(SQL_UPDATE,values);
于 2015-09-18T20:01:51.723 に答える