Вопрос по hibernate sqlQuery with named parametres.

serg13

String q = "SELECT MAX(value) FROM (SELECT :searchValue as value FROM T_PersonalAccounts WHERE accountNumber LIKE :maskValue GROUP BY :searchValue)";
sqlQuery.setString("maskValue", maskValue);
sqlQuery.setString("searchValue", searchValue);
В результате ( sqlQuery.list().get(0) ) возвращается строка searchValue вместо найденного в базе.
При использовании тупой конкатенации
String q = "SELECT MAX(value) FROM (SELECT "+ searchValue +" as value FROM T_PersonalAccounts WHERE accountNumber LIKE '"+ maskValue +"' GROUP BY "+ searchValue +")";
в результате - то, что найдено по базе.
Но так делать как-то не айс.
Где я туплю с первым вариантом?

hprt

searchValue - название поля, как я понимаю, его как переменную нельзя передавать скорее всего (с хибернатом очень давно не работал)

serg13

Это сборное выражение типа substr(fieldName, 10, 5).

hprt

Не, я к тому, что там ожидается сиквельное выражение, и произвольную строку так подставить нельзя, что, в общем-то, правильно

0000

Напишу очень упрощенно как в Oracle (у тебя думаю аналогично): сервер получая запрос, разбирает его, выкидывая константы, т.е. запросы аналогичны
select * from t where id = 5
...
select * from t where id = :x

Если ты используешь запрос с параметром, а потом биндишь x, то серверу достаточно один раз разобрать запрос, а потом уже тупо подставлять разные x.
На этом экономится время. Если запрос уникальный, то преимущества использовать запрос с биндингом нет.
Запрос вида group by :x уже не катит, поскольку запросы вида
select a from t group by a 
...
select b from t group by b

принципиально различные.

serg13

Ясно, значит в данной ситуации использовать параметры
а) не имеет смысла
б) не прокатит

0000

Биндинг вроде еще нужен, чтобы обезопаситься от пользовательского ввода, т.е. чтобы пользователь sql-запрос вместо :x не подставил.

serg13

Ради этого и заморочено. На searchValue думаю можно забить, ибо там вычисляемый параметр, maskValue прилетает из формы, для него нужно, но с ним одним билдинг прокатит.
Оставить комментарий
Имя или ник:
Комментарий: