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');

那里没有什么奇怪的。现在我想使用 PreparedStatment 批量处理:

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.

显然我错过了一些东西。为什么我可以使用纯 SQL 而不是 JDBC 插入“某些东西”?

4

2 回答 2

4

这是 PostgreSQL 中与客户端驱动程序和 ORM 交互的严格转换问题的另一个变体,它们将他们不理解的所有内容都发送为字符串。

您需要setObjectTypes.OTHERIIRC 一起使用。

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

哪个 PgJDBC 应该作为 type 的绑定参数发送unknown。因为您直接使用 PgJDBC,所以这很容易处理,幸运的是;当人们使用 ORM 层时,这真的很痛苦。

看:

为背景。

于 2014-01-30T05:13:10.270 回答
3

如果preparedStatemnt.setString() 不起作用,为什么不创建存储过程并使用String 参数从CallableStatement 调用它以通过它插入带有ltree 的行?

其他解决方案可能是ps.setObject(2, foos.get(i).getPath(), Types.OTHER);,但我现在无法检查。

于 2014-01-30T03:39:48.643 回答