我有一个带有内部联接的选择查询,where 子句位于第二个查询中,
这是代码:
static String Showplan = "SELECT * From plan_audit INNER JOIN (SELECT Du,Au From Programme_audit Where Du = '?' AND Au = '?')AS T ";
public void buttonClick(ClickEvent event) {
try{
Class.forName("com.mysql.jdbc.Driver");
Core.con = DriverManager.getConnection(Core.db,Core.dbUsername,Core.dbPassword);
PreparedStatement st;
st = Core.con.prepareStatement(Core.Showplan);
st.setString(1,select.getValue().toString());
st.setString(2,select1.getValue().toString());
ResultSet rs = st.executeQuery();
while(rs.next()){
table.addItem(new Object[]{rs.getInt(1),rs.getString(2),rs.getDate(3),rs.getString(4), rs.getString(5),rs.getString(6),rs.getString(7),rs.getString(8),rs.getDate(9),rs.getString(10),rs.getString(11),rs.getDate(12),rs.getString(13),rs.getString(14),rs.getString(15)},rs.getInt(1));
}
}catch(Exception e){
e.printStackTrace();
}
}
});
引发的异常如下:
java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
最佳答案
不要在参数标记 ?
后添加单引号。事实上,不要对它们做任何事情,而是让 Java 根据需要插入数据:
String sql = "SELECT * From plan_audit INNER JOIN ";
sql += "(SELECT Du, Au From Programme_audit Where Du = ? AND Au = ?) t ";
PreparedStatement st = con.prepareStatement(sql);
st.setString(1, select.getValue().toString());
st.setString(2, select1.getValue().toString());
ResultSet rs = st.executeQuery();
准备好的语句的全部意义在于让 Java 关心如何将数据带入查询中。在这种情况下,由于您正在绑定(bind)字符串,因此它们将被单引号引起来,但您不需要关心这一点。
顺便说一句,您的查询实际上是在执行交叉联接,因为您从未指定联接条件。这可能是也可能不是您想要的,但很可能您希望在这里有某种连接条件。
关于mysql - SELECT 查询不传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48619674/