Проблема с PrepareStatement в Java - PullRequest
0 голосов
/ 27 февраля 2011

Я создал таблицу с 3 полями язык, страна, тип установки. Когда я пишу запрос, чтобы напечатать максимальное значение в каждом поле, я получаю странную проблему. Может кто-нибудь сказать причину. Вот мой код.

PreparedStatement ps1= null;
ps1 = conn.prepareStatement("desc Configuration");

ResultSet rs1=ps1.executeQuery();
while(rs1.next()) {

    System.out.print(rs1.getString(1)+":");

    PreparedStatement ps2= null;

    ps2 = conn.prepareStatement("select ? from Configuration c1 "+
                                "  group by language "+
                                "  having count(*) >= all " +
                                "     ( select count(*) from Configuration c2 "+
                                "         group by language )");

    ps2.setString(1,rs1.getString(1));

    ResultSet rs2=ps2.executeQuery();

    while(rs2.next())
        System.out.print(rs2.getString(1));

    System.out.println();
}

Вывод, который я получаю здесь, language: language Но вывод, который я ожидаю, язык: английский вот так. Я получаю вывод позже, если я заменю '?' с языком в подготовить заявление. Но если я даю то же самое с? Я получаю то, что я дал для ps2.setString.

Почему это происходит. Любые решения?

Ответы [ 3 ]

5 голосов
/ 27 февраля 2011

? в подготовленных выражениях не является заполнителем для текстовой подстановки, это параметр, поэтому его значение всегда интерпретируется как данные, а не как произвольная часть синтаксиса запроса.

Таким образом, в данном случае фактический выполняемый запрос эквивалентен select 'language' from ....

Если вам нужно заменить части запроса, кроме данных, вы должны использовать конкатенацию (остерегайтесь SQL-инъекций!):

ps2 = conn.prepareStatement("select " 
    + rs1.getString(1)
    + " from Configuration c1 group by language having count(*) >= all( select count(*)from Configuration c2 group by language )");  
2 голосов
/ 27 февраля 2011

Вы не можете установить имена столбцов, используя PreparedStatement.Вы можете установить только значения столбцов.

Вместо того, чтобы использовать этот подход, вам придется самостоятельно создавать sql, используя конкатенацию, например:

String sql = "select "+ rs1.getString(1) + " from Configuration c1 group by language having count(*) >= all( select count(*)from Configuration c2 group by language)";
1 голос
/ 27 февраля 2011

'?'Метка в ps2 распознается как литерал-строка.Не в качестве имени столбца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...