准备好的声明问题

时间:2014-02-01 15:23:49

标签: java mysql jdbc

在以下代码中:

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时,它给了我另一个错误。此外,该语句有两个占位符,所以我不明白为什么这个代码失败。

我是否忽略了文档中的内容?

2 个答案:

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

也可能存在其他问题。