2017-03-13 11 views
1

HyperSQLのテーブルとUUIDの配列の列がある場合、INSERTPreparedStatementを作成してそのようなフィールドを作成する適切な方法は何ですか?JDBCのPreparedStatementを使用してUUIDの配列をHyperSQLデータベースに挿入する方法

SSCCE:

public class Example{ 
    public static void main(String[] args) throws Exception{ 
     // Create UUID array 
     UUID[] exmapleArray = new UUID[5]; 

     for(int i = 0; i < exmapleArray.length; i++){ 
      exmapleArray[i] = UUID.randomUUID(); 
     } 

     // Load database class 
     Class.forName("org.hsqldb.jdbc.JDBCDriver"); 

     // Connect to database 
     try(Connection databaseConnection = DriverManager.getConnection("jdbc:hsqldb:mem:foo")){ 
      try(Statement createStatement = databaseConnection.createStatement()){ 
       createStatement.executeUpdate("CREATE TABLE bar(test_field UUID ARRAY[10])"); 
      } 

      try(PreparedStatement preparedStatement = databaseConnection.prepareStatement("INSERT INTO bar VALUES (?)")){ 
       // None of the below examples work 

       // preparedStatement.setArray(1, databaseConnection.createArrayOf("UUID", exmapleArray)); 
       // preparedStatement.setArray(1, databaseConnection.createArrayOf("VARCHAR", exmapleArray)); 
       // preparedStatement.setArray(1, databaseConnection.createArrayOf("UUID", Arrays.stream(exmapleArray).map(UUID::toString).toArray())); 
       // preparedStatement.setArray(1, databaseConnection.createArrayOf("VARCHAR", Arrays.stream(exmapleArray).map(UUID::toString).toArray())); 

       // preparedStatement.setArray(1, new JDBCArrayBasic(exmapleArray, Type.BINARY_UUID)); 
       // preparedStatement.setArray(1, new JDBCArrayBasic(Arrays.stream(exmapleArray).map(UUID::toString).toArray(), Type.BINARY_UUID)); 

       preparedStatement.executeUpdate(); 
      } 
     } 
    } 
} 

平野UUIDは、配列を移入PreparedStatement.setString()で行うことができます移入しながら、しかし、最も一般的なもの、上記の文の選択に応じて、いくつかの異なる例外を得、動作するようには思えません。コメントアウトされた試みの

Exception in thread "main" 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.JDBCConnection.createArrayOf(Unknown Source) 
    at Example.main(Example.java:31) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 
Caused by: org.hsqldb.HsqlException: incompatible data type in conversion 
    at org.hsqldb.error.Error.error(Unknown Source) 
    at org.hsqldb.error.Error.error(Unknown Source) 
    at org.hsqldb.types.CharacterType.convertToDefaultType(Unknown Source) 
    at org.hsqldb.types.CharacterType.convertJavaToSQL(Unknown Source) 
    ... 7 more 

後者の二つは、同様incompatible data type in conversionをもたらす(具体的JDBCArrayBasic)HSQLDB固有のクラスを使用します。

答えて

1

私が提案Oあなたが例えば使用する必要がinsert an arrayに、あなたのPreparedStetementを移入するためにループを使用します。

String query = "INSERT INTO bar VALUES ARRAY["; 
String del = ""; 
for (int i = 0; i < 10; i++) { 
    query += del+"?" ; 
    del = ","; 
} 
query += "]"; 
System.out.println(query); 

INSERT INTO bar VALUES ARRAY[3.45, 23.64, 14.01] 

ですから、このようなループを使用する必要があなたの配列を埋めるために は

クエリ、今までのようになります。

INSERT INTO bar VALUES ARRAY[?,?,?,?,?,?,?,?,?,?] 

、あなたは、Th1のように完了することができますS:

PreparedStatement preparedStatement = connection.prepareStatement(query); 
for (int i = 1; i <= 10; i++) { 
    preparedStatement.setString(i, "valu_"+i); 
} 
System.out.println("Query = " + preparedStatement.toString()); 

ので、最後にあなたのpreparedStetementは、例えば次のようになります。

INSERT INTO bar VALUES ARRAY['valu_1','valu_2','valu_3','valu_4','valu_5','valu_6','valu_7','valu_8','valu_9','valu_10'] 

・ホープ、この缶はあなたのアイデアを提供します。