【发布时间】:2018-03-08 16:34:44
【问题描述】:
我目前正在使用 PreparedStatement 在 Java Web 服务中构建 SQL 查询。我的服务接受多个可选参数来过滤此查询,其中一个过滤器是一个 id 数组。我目前通过使用 nvl() 检查值来说明可选参数为空(未指定),但这不适用于 IN 子句。
我的查询目前如下所示:
SELECT
a.item_type
a.item_flag
a.item_id
FROM tableA a
WHERE
a.item_type = nvl(?, a.item_type)
AND a.item_flag = nvl(?, a.item_flag)
AND a.item_id IN nvl(?, a.item_id)
我正在设置我准备好的语句值:
private void assignStatementValues(final PreparedStatement statement,
final String itemType, final int itemFlag,
final List<Long> itemIds) throws SQLException {
Integer itemFlag;
if (Strings.isNullOrEmpty(itemType)) {
statement.setNull(1, java.sql.Types.VARCHAR);
} else {
statement.setString(1, itemType);
}
if (itemFlag == null) {
statement.setNull(2, java.sql.Types.INTEGER);
} else {
statement.setInt(2, itemFlag);
}
if (itemIds == null) {
statement.setNull(3, java.sql.Types.ARRAY);
} else {
statement.setArray(3, statement.getConnection().createArrayOf("bigint", itemIds.toArray()));
}
statement.executeQuery();
}
目前,当删除“AND...IN”子句时,我的查询使用可选参数,但当“AND...IN”子句存在时,我收到 500 响应。有没有更好的方法来构造我对可选列表/数组参数的查询?
【问题讨论】:
-
您可以随时动态生成 SQL 并在需要时添加子句。更长的答案是使用 JPA 或其他框架来构建“谓词”或“条件”查询。
-
@JustinKSU 是的,这似乎不是一个很好的方法,所以我只是加载一个简单的“基本查询”并在执行查询之前动态添加我的过滤器似乎正在工作。感谢您的帮助。
标签: java sql rest jax-rs prepared-statement