Java 型が Postgres ltree 型にマップされることを知っている人はいますか?
次のようなテーブルを作成します。
CREATE TABLE foo (text name, path ltree);
挿入のカップル:
INSERT INTO foo (name, path) VALUES ( 'Alice', 'ROOT.first.parent');
INSERT INTO foo (name, path) VALUES ( 'Bob', 'ROOT.second.parent');
INSERT INTO foo (name, path) VALUES ( 'Ted', 'ROOT.first.parent.child');
INSERT INTO foo (name, path) VALUES ( 'Carol', 'ROOT.second.parent.child');
奇妙なことは何もありません。ここで、PreparedStatement を使用してこれをバッチ処理したいと思います。
public final String INSERT_SQL = "INSERT INTO foo( name, path) VALUES (?, ?)";
public void insertFoos(final List<Foo> foos)
{
namedParameterJdbcTemplate.getJdbcOperations().batchUpdate(INSERT_SQL, new BatchPreparedStatementSetter()
{
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException
{
ps.setString(1, foos.get(i).getName());
ps.setString(2, foos.get(i).getPath());
}
@Override
public int getBatchSize()
{
return foos.size();
}
});
}
これにより、次のエラーが生成されます。
org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [INSERT INTO foo( name, path) VALUES (?, ?)]; nested exception is
org.postgresql.util.PSQLException: ERROR: column "path" is of type ltree but expression is of type character varying
Hint: You will need to rewrite or cast the expression.
明らかに私は何かが欠けています。JDBC ではなく純粋な SQL を使用して「何か」を挿入できるのはなぜですか?