私のクラス
class PgFolder {
long id;
int[] pgFeature;
}
getter...
setter...
私のテーブル
CREATE TABLE folder {
ID BIGSERIAL PRIMARY KEY,
feature INT[]
}
私のxml
<insert id="insertManyFolder" parameterType="java.util.List">
INSERT INTO
folder
(feature)
VALUES
<foreach collection="list" item="item" index="" separator=",">
(#{item.pgFeature})
</foreach>
</insert>
List<PgFolder>
リストを挿入したい。リストには多くのPgFolderインスタンスがあります。プログラムを実行すると、エラーが発生しました。
org.apache.ibatis.exceptions.PersistenceException:
データベースの更新中にエラーが発生しました。原因:java.lang.IllegalStateException:プロパティ '__frch_item_0.pgFeature'のパラメーターマッピングで型ハンドラーがnullでした。javaType(java.util.List):jdbcType(null)の組み合わせで指定されていないか、見つからなかった。
原因:java.lang.IllegalStateException:タイプハンドラーは、プロパティ '__frch_item_0.pgFeature'のパラメーターマッピングでnullでした。javaType(java.util.List):jdbcType(null)の組み合わせで指定されていないか、見つからなかった。**
このエラーメッセージが表示されたのはなぜですか?配列の値を正しい方法で挿入するにはどうすればよいですか?postgresクライアントでsqlを使用する場合、配列値を挿入できます。そのため、私がインストールしたバージョンのpostgresは配列値をサポートできます。
マッピングInteger[]
プロパティとマッピングint[]
プロパティの両方のソリューションについて説明します。
Integer[]
class PgFolder {
long id;
Integer[] pgFeature;
// getter / setter
}
この場合、MyBatisの組み込みを使用できますArrayTypeHandler
。パラメータ参照での
指定typeHandler
で十分です。
<foreach ...>
(#{item.pgFeature,typeHandler=org.apache.ibatis.type.ArrayTypeHandler})
</foreach>
int[]
ビルトインArrayTypeHandler
はプリミティブ配列では機能しない可能性があるため、カスタムタイプハンドラーの作成が必要になる場合があります。例えば
package pkg;
import java.sql.Array;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
public class PgIntArrayTypeHandler extends BaseTypeHandler<int[]>{
@Override
public void setNonNullParameter(PreparedStatement ps, int i, int[] parameter, JdbcType jdbcType)
throws SQLException {
ps.setObject(i, parameter);
}
@Override
public int[] getNullableResult(ResultSet rs, String columnName) throws SQLException {
return extractArray(rs.getArray(columnName));
}
@Override
public int[] getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return extractArray(rs.getArray(columnIndex));
}
@Override
public int[] getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return extractArray(cs.getArray(columnIndex));
}
protected int[] extractArray(Array array) throws SQLException {
if (array == null) {
return null;
}
// pgjdbc returns Integer[] for the INT[] column
Integer[] wrapperArray = (Integer[]) array.getArray();
int[] result = Arrays.stream(wrapperArray).mapToInt(Integer::intValue).toArray();
array.free();
return result;
}
}
次に、パラメーター参照で型ハンドラーを指定します。
<foreach ...>
(#{item.pgFeature,typeHandler=pkg.PgIntArrayTypeHandler})
</foreach>
MyBatis 3.5.5およびpgjdbc 42.2.15でテスト済み。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加