在以下代码中:
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时,它给了我另一个错误。此外,该语句有两个占位符,所以我不明白为什么这个代码失败。
我是否忽略了文档中的内容?
答案 0 :(得分:2)
从?
PreparedStatement占位符周围删除引号。 JDBC驱动程序将为您引用字符串。当您自己引用字符串占位符时,JDBC驱动程序会认为您要在语句中传递文字?
。
您还没有提到您正在使用的数据库,但MySQL JDBC驱动程序的主要作者在此处确认了这一点:http://forums.mysql.com/read.php?39,499385,499450#msg-499450
答案 1 :(得分:0)
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;";
也可能存在其他问题。