带有* ANY *条件的Java SQL Prepared语句

时间:2012-02-17 22:35:46

标签: java mysql prepared-statement

见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)之类的技巧 有这样的事吗?

2 个答案:

答案 0 :(得分:2)

不,没有。您需要动态撰写查询。

不需要创建所有组合。如果定义了参数,只需在查询中附加"and c1 = ?"即可。

有些API可以帮助您。例如,请参阅http://www.jooq.org/

答案 1 :(得分:1)

您可以选择使用框架,自己动手或做一些sql技巧。例如。 JPA有CriteriaBuilder

否则将您的查询拆分为静态和动态部分。根据您的动态部分,您必须进行绑定。你会有

SELECT * FROM mytable WHERE ref=? AND time=>? AND time<?

作为您的静态部分,仅在需要时添加AND C1 = ?

对于SQL选项,您可以添加3个参数并将其设置为01

SELECT * FROM mytable WHERE ref=? AND time=>? AND time<? 
AND (CHECKC1 = ? OR C1=?) AND (CHECKC2 = ? OR C2=?) AND (CHECKC3 = ? OR C3=?);

但我不认为这是一个很好的解决方案。