2014-02-01 3 views
0

В следующем коде:Проблемы с подготовленным заявлением

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, он дал мне еще одну ошибку. Кроме того, в заявлении есть два заполнителя, поэтому я не понимаю, почему этот код терпит неудачу.

Я что-то забыл в документации?

+1

Может быть, вы добавили параметры в 'SQLQueries.isMuted' вместо' isBanned'? –

+2

Вам не нужно удалять котировки вокруг параметров? – Keppil

+1

Я думаю, что Keppil прав - Java не видит никаких параметров в SQL, он видит (и не имеет отношения) условие проверки на равенство с литеральной строкой, содержащей ровно один знак вопроса. Так измените '?' с ?. – Chris

ответ

2

Удалите котировки из-за ? Подготовленные заполнители. Драйвер JDBC будет приводить строки для вас. При цитировании строкового заполнителя самостоятельно, драйвер JDBC считает, что вы хотите передать литерал ? в своем заявлении.

Вы не упомянули базу данных, которую вы используете, но главный автор для драйвера JDBC для MySQL подтверждает это здесь: http://forums.mysql.com/read.php?39,499385,499450#msg-499450

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

Там могут быть и другие проблемы.

+0

Я добавил пробел, но это, похоже, не исправить. – LeoTietz

Смежные вопросы