4

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 を使用して「何か」を挿入できるのはなぜですか?

4

2 に答える 2

4

これは、理解できないものすべてを文字列として送信するクライアント ドライバーおよび ORM と対話する PostgreSQL の厳密なキャストの問題のさらに別の変形です。

、IIRCで使用setObjectする必要があります。Types.OTHER

    ps.setObject(2, foos.get(i).getName(), Types.OTHER);

どの PgJDBC が type のバインド パラメータとして送信する必要があるかunknown。幸いなことに、PgJDBC を直接操作しているため、これは簡単に処理できます。人々が ORM レイヤーを使用しているときは本当に苦痛です。

見る:

背景用。

于 2014-01-30T05:13:10.270 に答える
3

prepareStatemnt.setString() が機能しない場合、ストアド プロシージャを作成し、それを String パラメータで CallableStatement から呼び出して、それを介して ltree で行を挿入してみませんか?

他の解決策かもしれませんがps.setObject(2, foos.get(i).getPath(), Types.OTHER);、今は確認できません。

于 2014-01-30T03:39:48.643 に答える