问题描述
我有一个使用 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 (将#修改为@)