gpt4 book ai didi

java - JDBCIO 调用 Postgres 例程(存储过程),它将自定义对象类型作为参数

转载 作者:行者123 更新时间:2023-11-29 13:41:06 24 4
gpt4 key购买 nike

我正在尝试调用一个将自定义对象类型作为参数的 Postgres 例程。

create type person_type as
(
first varchar,
second varchar,
is_real boolean
);

我的例程(存储过程):

create function person_routine(person person_type)
returns void
language plpgsql
as $$

BEGIN
INSERT INTO person(first, second, is_real) VALUES
(person.first,person.second,person.is_real);

END;
$$;

然后我尝试创建一个 Java 类来表示自定义类型:

import java.sql.SQLData;
import java.sql.SQLException;
import java.sql.SQLInput;
import java.sql.SQLOutput;

public class PersonType implements SQLData {

public String first;
public String second;
public boolean is_real;
private String sql_type;

@Override
public String getSQLTypeName() throws SQLException {
return sql_type;
}

@Override
public void readSQL(SQLInput stream, String typeName) throws SQLException {
sql_type = typeName;
second = stream.readString();
first = stream.readString();
is_real = stream.readBoolean();
}

@Override
public void writeSQL(SQLOutput stream) throws SQLException {
stream.writeString(first);
stream.writeBoolean(is_real);
stream.writeString(second);
}
}

然后我尝试执行这样的代码:

.apply(JdbcIO.<Person>write()
.withDataSourceConfiguration(JdbcIO.DataSourceConfiguration.create(
"org.postgresql.Driver", configuration.GetValue("postgres_host"))
.withUsername(configuration.GetValue("postgres_username"))
.withPassword(configuration.GetValue("postgres_password")))
.withStatement("SELECT person_routine(?)")
.withPreparedStatementSetter(new JdbcIO.PreparedStatementSetter<Person>() {
public void setParameters(Person element, PreparedStatement query)
throws SQLException {
PersonType dto = new PersonType();
dto.first = element.first;
dto.second = element.second;
dto.is_real = element.is_real;
query.setObject(1, dto);
}
})
);

不幸的是,这给了我一个异常(exception):

java.lang.RuntimeException: org.postgresql.util.PSQLException: Can't infer the SQL type to use for an instance of dto.PersonType. Use setObject() with an explicit Types value to specify the type to use.

任何帮助都会很棒。

最佳答案

因此,它是关于使用 PGobject() 的。这就是我实现它的方式,它似乎工作得很好。

 PGobject person = new PGobject();
person.setType("person_type");
person.setValue(String.format("(%s,%s,%s)","something","something","FALSE"));
query.setObject(1, person);

关于java - JDBCIO 调用 Postgres 例程(存储过程),它将自定义对象类型作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55366808/

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