PreparedStatement на Java и вероятность установить параметры - PullRequest
0 голосов
/ 05 марта 2012

Есть хороший способ использовать подготовленный оператор в Java, где есть вероятность того, что какой-то параметр может быть установлен или не задан?

Предположим, у меня есть полный запрос, подобный этому:

SELECT * FROM Table1 WHERE Field1='....' AND Field2='....' AND Field3='....'

Тогда в моей программе я хотел бы сделать что-то подобное (я знаю, что это невозможно, как я пишу)

// part of code where I have 3 variable set by some logic and the query itself
//.........

String Query = "SELECT * FROM Table1 WHERE Field1=? ";
PreparedStatement s = conn.prepareStatement();          
s.setString(1, Field1Var);

if (Field2Var != Value)
{
    Query += " AND Field2=? ";
    s.setString(2, Field2Var);
}

if (Field3Var != Value3)
{
    Query += " AND Field3=? ";
    s.setString(3, Field3Var);
}
s = conn.prepareStatement(query);   

Как можноЯ добиваюсь этого без написания множества разных запросов?

Ответы [ 3 ]

1 голос
/ 05 марта 2012
String query = "SELECT * FROM Table1 WHERE 1=1";

if (Field1Var != Value1) {
    query += " AND Field1 = ? ";
}

if (Field2Var != Value2) {
    query += " AND Field2 = ? ";
}

if (Field3Var != Value3) {
    query += " AND Field3 = ? ";
}

PreparedStatement s = conn.prepareStatement(query); 

int i = 0;

if (Field1Var != Value1) {
    s.setString(++i, Field1Var);
}

if (Field2Var != Value2) {
    s.setString(++i, Field2Var);
}

if (Field3Var != Value3) {
    s.setString(++i, Field3Var);
}
  1. Используйте дополнительное условие 1 = 1.
  2. Используйте переменную счетчика.

Или вы можете написать «NamedPreparedStatement», как я.(https://gist.github.com/1978317)

0 голосов
/ 05 марта 2012

Другим решением является использование «более объектно-ориентированного подхода» с использованием Hibernate Criteria API , который позволяет динамически создавать запросы (типичное использование - поисковый запрос со многими параметрами), но я не знаю, какой технологический стек вы используетеиспользовать.

0 голосов
/ 05 марта 2012

Вы не можете.Весь смысл подготовленного оператора состоит в том, что он «подготовлен», что означает, что он анализируется (либо драйвером, либо сервером), и все, что вы делаете с каждым запуском, это задаете параметры.

код, который вы пытаетесь написать, также станет кошмаром для всех остальных.Было бы намного чище, если бы вы просто слились и написали запросы.(Или использовал инструмент ORM.)

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