gpt4 book ai didi

JDBC 中的 Java 类型到 Postgres ltree

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:47:47 32 4
gpt4 key购买 nike

有谁知道什么 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 插入“东西”?

最佳答案

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

您需要将 setObjectTypes.OTHER 一起使用,IIRC。

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

哪个 PgJDBC 应该作为 unknown 类型的绑定(bind)参数发送。因为您直接使用 PgJDBC,幸运的是,这对您来说很容易处理;当人们使用 ORM 层时,这真的很痛苦。

参见:

背景。

关于JDBC 中的 Java 类型到 Postgres ltree,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21447077/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com