准备好的陈述问题
在以下代码中:
PreparedStatement statement = conn .prepareStatement(SQLQueries.isMuted); statement.setString(1, player); statement.setString(2, player); //in SQLQueries.java public static final String isMuted = "SELECT EXISTS(SELECT * FROM " + "(SELECT playerid FROM mute, players AS player " + "WHERE player.username = '?' AND playerid = player.id" + "UNION ALL " + "SELECT playerid FROM tempmute, players AS player " + "WHERE player.username = '?' AND playerid = player.id) AS tbl) " + "AS isMuted;";
我收到以下错误:
[08:10:38 WARN]: java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
我很困惑,因为文档告诉我参数索引从1开始,这是确认的,因为当我将setString语句更改为0和1时,它给了我另一个错误。 此外,该语句有两个占位符,所以我不明白为什么这个代码失败。
我是否忽略了文档中的内容?
从周围删除引号?
PreparedStatement占位符。 JDBC驱动程序将为您引用字符串。 当你自己引用字符串占位符时,JDBC驱动程序认为你想传递一个文字?
在你的陈述中。
您还没有提到您正在使用的数据库,但MySQL JDBC驱动程序的主要作者在此确认了这一点: http : //forums.mysql.com/read.php?39,499385,499450#msg-499450
你需要在player.id
之后有一个空格:
public static final String isBanned = "SELECT EXISTS(SELECT * FROM " + "(SELECT playerid FROM bans, players AS player " + "WHERE player.username = '?' AND playerid = player.id " ---------------------------------------------------------------^ + "UNION ALL " + "SELECT playerid FROM tempban, players AS player " + "WHERE player.username = '?' AND playerid = player.id) AS tbl) " + "AS isBanned;";
可能还有其他问题。