Java 具有可变参数的简单查询

Java 具有可变参数的简单查询,java,sql,jdbc,prepared-statement,Java,Sql,Jdbc,Prepared Statement,我有三个查询,我想合并成一个查询,可以接受长度可变的WHERE参数;我一辈子都不记得该怎么做了 PreparedStatement queryOne = connection.prepareStatement ("SELECT columnOne, columnTwo, columnThree FROM tableOne WHERE columnOne = ?;" ); PreparedStatement queryTwo = connection.prepareStatement ("SEL

我有三个查询,我想合并成一个查询,可以接受长度可变的
WHERE
参数;我一辈子都不记得该怎么做了

PreparedStatement queryOne = connection.prepareStatement
("SELECT columnOne, columnTwo, columnThree FROM tableOne WHERE columnOne = ?;" );

PreparedStatement queryTwo = connection.prepareStatement
("SELECT columnOne, columnTwo, columnThree FROM tableOne WHERE columnTwo = ?;" );

PreparedStatement queryThree = connection.prepareStatement
("SELECT columnOne, columnTwo, columnThree FROM tableOne WHERE columnOne = ? AND columnTwo = ?;" );

所有三个查询都从同一个表中选择相同的列,因此可以在一条语句中轻松实现它们的联合:

SELECT columnOne, columnTwo, columnThree 
  FROM tableOne 
 WHERE columnOne = ?
    or columnTwo = ?
    or (columnOne = ? AND columnTwo = ?)

所有三个查询都从同一个表中选择相同的列,因此可以在一条语句中轻松实现它们的联合:

SELECT columnOne, columnTwo, columnThree 
  FROM tableOne 
 WHERE columnOne = ?
    or columnTwo = ?
    or (columnOne = ? AND columnTwo = ?)

回答了我自己的问题,请随意插话说明这是否是一种不好的做法

String columnOne = getValue();
String columnTwo = getValue();
String queryString = "SELECT columnOne, columnTwo, columnThree FROM tableOne"

if (columnOne != null && columnTwo != null)
    queryString = queryString + "WHERE columnOne = ? AND columnTwo = ?"
else if (columnOne != null)
    queryString = queryString + "WHERE columnOne = ?"
else if (columnTwo != null)
    queryString = queryString + "WHERE columnTwo = ?"

PreparedStatement query = connection.prepareStatement(queryString); 

回答了我自己的问题,请随意插话说明这是否是一种不好的做法

String columnOne = getValue();
String columnTwo = getValue();
String queryString = "SELECT columnOne, columnTwo, columnThree FROM tableOne"

if (columnOne != null && columnTwo != null)
    queryString = queryString + "WHERE columnOne = ? AND columnTwo = ?"
else if (columnOne != null)
    queryString = queryString + "WHERE columnOne = ?"
else if (columnTwo != null)
    queryString = queryString + "WHERE columnTwo = ?"

PreparedStatement query = connection.prepareStatement(queryString); 

“合并”是什么意思?您希望查询返回结果的并集、结果的交集或其他内容吗?我想创建一个PreparedStatement,它接受长度可变的WHERE语句。如果您是指“合并”联合可能会有所帮助。我不认为一个准备好的语句可以具有数量可变的WHERE子句条件,原因与准备好的语句中的字段名不能是占位符相同。dbms如何知道如何准备它?因此它只能在没有准备好的语句的情况下进行?你说的“合并”是什么意思?您希望查询返回结果的并集、结果的交集或其他内容吗?我想创建一个PreparedStatement,它接受长度可变的WHERE语句。如果您是指“合并”联合可能会有所帮助。我不认为一个准备好的语句可以具有数量可变的WHERE子句条件,原因与准备好的语句中的字段名不能是占位符相同。dbms如何知道如何准备它?因此它只能在没有准备好的语句的情况下进行?如果我只为第一个语句赋值?语句是否正确执行?@Dennis-否。您需要为每个占位符提供一个值。永远不要检查第三个条件,因为如果我只为第一个占位符赋值,这与第一个和第二个条件重叠?语句是否正确执行?@Dennis-否。您需要为每个占位符提供一个值。永远不要检查第三个条件,因为这与第一个和第二个条件重叠,