List<Guest> guestList = new ArrayList<>();
String query = "select * from Guests where ? like ?";
System.out.println("select * from Guests where " + property + " like '%" + value + "%'");
PreparedStatement preparedStatement = connection.prepareStatement(query);
preparedStatement.setString(1, property);
preparedStatement.setString(2, "'%" + value + "%'");
ResultSet resultSet = preparedStatement.executeQuery();
guestList = getGuestListFromResultSet(resultSet);
return guestList;
正如您在上面看到的,我创建了一个Prepared Statement,稍后用2个值填充它:property和value。在SQL Server中运行上述查询应该会给我一些结果。我还尝试了这些变化来设置第二个参数(值):
preparedStatement.setString(2, "%" + value + "%");
preparedStatement.setString(2, value);
这些似乎都不起作用。真正起作用的是简单地从字符串连接构建查询:
PreparedStatement preparedStatement = connection.prepareStatement("select * from Guests where " + property + " like '" + value + "'");
但是,我想使用一个准备好的语句。
不能使用变量作为列名。相反,您可以使用动态SQL
String query = """
DECLARE @sql nvarchar(max) = '
select *
from Guests
where ' + QUOTENAME(?) + ' like @value;
';
EXEC sp_executesql @sql,
N'@value nvarchar(100)',
@value = ?;
""";
注意使用QUOTENAME
来正确转义列名。
还要注意使用sp_executesql
来传递值。
我不确定JDBC驱动程序,但理想情况下,您应该使用正确命名的参数,而不是
?