准备好的陈述问题

在以下代码中:

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;"; 

可能还有其他问题。