具有 *ANY* 条件的 Java SQL Prepared 语句
Posted
技术标签:
【中文标题】具有 *ANY* 条件的 Java SQL Prepared 语句【英文标题】:Java SQL Prepared statement with *ANY* criteria 【发布时间】:2012-02-17 22:35:46 【问题描述】:满足 ps,一个可以完成工作的简单 PreparedStatement:
PreparedStatement ps = cnx.prepareStatement( "SELECT * FROM mytable WHERE ref=? AND time=>? AND time<?");
我需要添加 3 个可选条件(C1、C2、C3)。为清楚起见,可能需要它们而不是基于运行时参数。蛮力告诉我,我可以编写 9 个准备好的语句来涵盖所有可能性。但我真正想写的更像是:
SELECT * FROM mytable WHERE ref=? AND time=>? AND time<? AND C1=? AND C2=? AND C3=?;
并在执行语句之前使用 setInt(5, "ANY") 或 ignoreParameter(5) 之类的技巧 有这种事吗?
【问题讨论】:
【参考方案1】:不,没有。您需要动态地编写查询。
不过,无需创建所有组合。如果定义了参数,只需在查询中附加一个额外的"and c1 = ?"
即可。
有一些 API 可以为您做到这一点。例如,请参阅http://www.jooq.org/。
【讨论】:
【参考方案2】:您可以选择使用框架、自己做或做一些 sql 技巧。例如。 JPA 有一个CriteriaBuilder。
否则,将您的查询分为静态和动态部分。根据您的动态部分,您必须进行绑定。你会有
SELECT * FROM mytable WHERE ref=? AND time=>? AND time<?
作为您的静态部分并仅在需要时添加AND C1 = ?
。
对于 SQL 选项,您可以再添加 3 个参数并将它们设置为 0
或 1
。
SELECT * FROM mytable WHERE ref=? AND time=>? AND time<?
AND (CHECKC1 = ? OR C1=?) AND (CHECKC2 = ? OR C2=?) AND (CHECKC3 = ? OR C3=?);
但我认为这不是一个好的解决方案。
【讨论】:
以上是关于具有 *ANY* 条件的 Java SQL Prepared 语句的主要内容,如果未能解决你的问题,请参考以下文章
LINQ to SQL语句之Exists/In/Any/All/Contains
后续的变量声明必须具有相同的类型。变量“where”必须是“any[]”类型,但这里有“string[]”类型
java代码中组装where条件然后拼接到mybatis xml中的sql后面