2013-06-21 3 views
0

У меня есть DDBB со столом users, и я пытаюсь получить поля user_id и user_pass, ища user_name. Так что, когда я запускаю следующий запрос:Java PreparedStatement Wilcard не работает

SELECT `user_id`, `user_pass` FROM `users` WHERE `user_name` LIKE '%aName%'; 

возвращает, т.е. aName = «Джон»:

+---------+-----------+ 
| user_id | user_pass | 
+---------+-----------+ 
| 5 | "1234" | 
+---------+-----------+ 

Хорошо, тогда я хочу, чтобы выполнить это с помощью PreparedStatement, по этой причине я сделали эту функцию:

private final String QUERY_GETUSERNAME2 = 
     "SELECT `user_id`, `user_fname`" 
     + " FROM `users`" 
     + " WHERE `user_fname` LIKE ?;"; 

private String[][] getUsersInv(String usrName){ 
    ArrayList<String[]> alAux = new ArrayList(); 
    String[][] ret = null; 
    try{ 
     PreparedStatement st = _conn.prepareStatement(QUERY_GETUSERNAME2); 
     st.setString(1, "'%"+usrName+"%'"); 
     ResultSet rs = st.executeQuery(); 
     while(rs.next()){ 
      String[] asAux = {String.valueOf(rs.getInt(1)), rs.getString(2)}; 
      alAux.add(asAux); 
     }//while 
    }catch(SQLException e){ 
     e.printStackTrace(System.out); 
    }finally{ 
     if (!alAux.isEmpty()){ 
      ret = new String[alAux.size()][alAux.get(0).length]; 
      for (int i = 0; i < alAux.size(); i++) 
       ret[i] = alAux.get(i); 
     }//fi 
    } 
    return ret; 
} 

Как вы можете видеть, функция возвращает строку [] [], поэтому я проверяю в предыдущей функции, если возврат является или не нуль:

public void insertUsersInvTableModel(JTable table, String user){ 
    DefaultTableModel model = (DefaultTableModel) table.getModel(); 
    String[][] row = getUsersInv(user); 
    if (row != null) 
     model.addRow(row); 
} 

И эта функция вызова от слушателя для JButton:

private void addUserActionPerformed(java.awt.event.ActionEvent evt) {           
    if (comboUsers.getSelectedIndex() != 0){ 
     new Users(_conn).insertUsersInvTableModel(_target, String.valueOf(comboUsers.getSelectedItem())); 
     _target.validate(); 
     _target.repaint(); 
     setVisible(false); 
    } 
} 

Как вы можете себе представить, что есть JDialog с JComboBox со всеми пользователями перечисленных вниз. Как таблица users является AUTO_INCREMENT, у user_id есть некоторые пробелы (или, может быть, она и будет), и единственный способ построить JComboBox был не связан user_id с индексом JComboBox.

Но, проблема в том, что всякий раз, когда я выбираю элемент из JComboBox, и я запустить процесс, чтобы получить user_id и user_pass на основе выбранного элемента (ни индекса), то ResultSet всегда NULL.

Любая идея? Спасибо.

+0

Вы можете публиковать сгенерированный запрос? – Stephan

+1

@Stephan iirc это невозможно, потому что подготовленный оператор отправляется в db вместе с параметрами. нет строки запроса, сгенерированной на стороне java –

+0

@MarcoForberg thx для очистки этого, я не использовал подготовленные заявления до – Stephan

ответ

2

заменить

st.setString(1, "'%"+usrName+"%'"); 

с

st.setString(1, "%"+usrName+"%"); 

Одиночные кавычки автоматически добавляется в PreparedStatement. С Котировки запрос будет искать строки '%usrname%' вместо %usrname%

1

попробовать

st.setString(1, "%"+usrName+"%"); 

вместо

st.setString(1, "'%"+usrName+"%'"); 
0

РЕШЕНИЕ Как отметил Марко Форберг, котировки, используемые для envolve параметра строки (') не являются обязательными. Удаление их исправляет проблему.