Умный способ добавить один и тот же параметр в несколько мест в подготовленном операторе - PullRequest
2 голосов
/ 16 июля 2010

У меня есть запрос JDBC, такой как

select * from table1 where col1 between x and y
union all
select * from table2 where col1 between x and y
union all
select * from table3 where col1 between x and y

Я использую подготовленное утверждение и мне интересно, есть ли более умный способ установить x и y, не говоря setDate(1, x);setDate(2, y);setDate(3, x);

Ответы [ 4 ]

0 голосов
/ 03 сентября 2010

зачем быть "умным"?Умный код обычно приводит к «умным» ошибкам в «умных» угловых случаях.

Кстати, если вы используете hibernate, ваш запрос будет выглядеть так:

select * from table1 where col1 between :x and :y
union all
select * from table2 where col1 between :x and :y
union all
select * from table3 where col1 between :x and :y

Код Java будет выглядеть следующим образом:

Query query;
query.setParameter("x", x);
query.setParameter("y", y);
0 голосов
/ 20 июля 2010

поумнее. Может петля? Цикл for, который выполняется три раза и вызывает:

setDate((1*2)+1, x);
setDate((1*2)+2, y);
0 голосов
/ 02 сентября 2010

Если ваша БД приличная, вы можете сделать:

select * from (
select * from table1 
union all
select * from table2
union all
select * from table3
)
where col1 between x and y

и передать x и y только один раз.Оптимизатор применил бы предикат к каждой таблице, если это уместно.

0 голосов
/ 16 июля 2010

Я бы воспользовался форматировщиком строк Java:

String queryFormat = "select * from table1 where col1 between %1$s and %2$s " +
                     "union all " +
                     "select * from table2 where col1 between %1$s and %2$s " +
                     "union all " +
                     "select * from table3 where col1 between %1$s and %2$s";
String query = String.format(queryFormat,"5","10");

Первый аргумент, передаваемый методу формата, - это строка формата. %1$s означает вставку 1 -ого аргумента типа s tring ("5"), а %2$s означает вставку 2 nd аргумент типа s tring ("10").

Строка запроса будет содержать:

select * from table1 where col1 between 5 and 10 union all select * from table2 where col1 between 5 and 10 union all select * from table3 where col1 between 5 and 10

Вы можете узнать больше о классе Formatter здесь .

Надеюсь, это поможет.

...