ВЫБЕРИТЕ IN используя "StringUtils.join (array," ',' ");" - PullRequest
0 голосов
/ 31 августа 2011

Я должен выполнить запрос к БД, где, поскольку одно из переданных значений является массивом, который я использовал StringUtils.join(array, "','") Вот как я его реализовал, этот код является частью серверной части веб-службы

 public String medico(int age, String sexstr, String etniastr, String[] sintom)  {

      String tes=StringUtils.join(sintom, "','");
      String ris = "no";
      String q;
      String errore = connetti();
        try {
          if (errore.equals("")) {
            Statement st = conn.createStatement();
            //ESECUZIONE QUERY

       q = "SELECT DISTINCT nome FROM malattia WHERE eta='" + age + "' AND sesso='" + sexstr + "' AND etnia='" + etniastr + "' AND sintomi IN('tes')";

                    ResultSet rs = st.executeQuery(q);
                    if (!rs.last()) {
                          ris = "no";
                    } else {
                          ris = "si";
                    }
              } else {
                    ris = errore;
              }
              conn.close();
            } catch (Exception e) {
              ris = e.toString();
            }
            return ris;
        }

Кажется, проблема в том, как я передаю tes , когда я передаю его так, как написано, выдается ошибка 500 (внутренняя ошибка сервера), когда я меняю ее на:

         ..... sintomi IN('"+tes+"')";

Это дает мне ноль строк, даже если соответствующие данные существуют в БД

, как правильно решить эту проблему?Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 31 августа 2011
private String MEDICO_SQL = "SELECT DISTINCT nome FROM malattia WHERE eta=? AND sesso=? AND etnia=? AND sintomi IN (%s)";
public String medico(int age, String sexstr, String etniastr, String[] sintom)  {
    try {
        String sql = String.format(MEDICO_SQL, StringUtils.repeat("?", ",", sintom.length));

        PreparedStatement st = conn.prepareStatement(sql);
        st.setInteger(1, age);
        st.setString(2, sexstr);
        st.setString(3, etniastr);
        for (int i=0; i<sintom.length; i++) {
            st.setString(3+i, sintom[i]);
        }
        ResultSet rs = s.executeQuery();
        ... process results ...
    } catch (....) {
       ... handle exceptions ...
    }
}

Я предполагаю, что StringUtils, который вы используете, это Apache Commons.

0 голосов
/ 31 августа 2011

Проблема в том, что вы должны добавить одинарную кавычку в начале и в конце, кроме запятой.

Взгляните на это:

@Test
public void testArray() {
    String[] strArray = {"hello", "world", "bye"};

    System.out.println(singleQuoteAndComma(strArray));
}

private String singleQuoteAndComma(String[] strArray) {
    String in = "";
    for (int i = 0; i < strArray.length ; i++) {
        in += "'" + strArray[i] + "'";
        if (i != strArray.length - 1) {
            in += ",";
        }
    }
    return in;
}

Выход:

'hello','world','bye'

Используйте метод singleQuoteAndComma, а затем добавьте строку результата к вашему запросу.

Я сделал исправление:

public String medico(int age, String sexstr, String etniastr, String[] sintom)  {

      String tes= singleQuoteAndComma(sintom);
      String ris = "no";
      String q;
      String errore = connetti();
        try {
          if (errore.equals("")) {
            Statement st = conn.createStatement();
            //ESECUZIONE QUERY

       q = "SELECT DISTINCT nome FROM malattia WHERE eta='" + age + "' AND sesso='" + sexstr + "' AND etnia='" + etniastr + "' AND sintomi IN(" + tes + ")";

                    ResultSet rs = st.executeQuery(q);
                    if (!rs.last()) {
                          ris = "no";
                    } else {
                          ris = "si";
                    }
              } else {
                    ris = errore;
              }
              conn.close();
            } catch (Exception e) {
              ris = e.toString();
            }
            return ris;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...