如何解决JDBI - 绑定 Bean 与列表属性
我有一个使用 jdbi 查询 Redshift 集群的程序,我正在努力使用 bindBean
功能生成适当的 sql 语句。
@Data @Builder
public static class User {
private String id;
private List<String> emailAddresses;
}
private jdbi createjdbi(
@NonNull String jdbcUri,@NonNull String username,@NonNull String password) {
RedshiftSimpleDataSource redshiftDataSource = new RedshiftSimpleDataSource();
redshiftDataSource.setUrl(jdbcUri);
redshiftDataSource.setUser(username);
redshiftDataSource.setPassword(password);
return jdbi.create(redshiftDataSource);
}
public void jdbiQuery() {
User user = User.builder()
.id("1234")
.emailAddresses(List.of("user@email.com","email@user.com"))
.build();
String sqlTemplate =
"SELECT id FROM Users WHERE id = :id AND email_address IN (:emailAddresses)";
jdbi jdbi = createjdbi(JDBC_URI,USERNAME,PASSWORD);
List<String> userIds = jdbi.withHandle(
handle -> handle.createquery(sqlTemplate)
.bindBean(user)
.mapTo(String.class)
.list()
);
}
上面的代码抛出异常:org.jdbi.v3.core.statement.UnabletoCreateStatementException: No argument factory registered for type [java.util.List<java.lang.String>]
。
public void jdbiQuery() {
.
.
jdbi jdbi = createjdbi(JDBC_URI,PASSWORD);
jdbi.registerarrayType(String.class,"varchar");
.
.
}
确实,删除了异常,但最终生成的 sql 语句不正确(注意 IN 子句的格式不正确)。
SELECT id FROM Users WHERE id = '1234' AND email_address IN ('{"user@email.com","email@user.com"}')
由于使用 bindList
功能的列表标识符包含在 <>
中,我尝试将 sql 模板更改为:
.
.
String sqlTemplate =
"SELECT id FROM Users WHERE id = :id AND email_address IN (<emailAddresses>)";
.
导致以下异常:
Caused by: org.jdbi.v3.core.statement.UnabletoCreateStatementException: Undefined attribute for token '<emailAddresses>'
有谁知道如何解决这个问题?欢迎任何建议:)
谢谢!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。