Вопрос по hibernate sqlQuery with named parametres.
searchValue - название поля, как я понимаю, его как переменную нельзя передавать скорее всего (с хибернатом очень давно не работал)
Это сборное выражение типа substr(fieldName, 10, 5).
Не, я к тому, что там ожидается сиквельное выражение, и произвольную строку так подставить нельзя, что, в общем-то, правильно
Напишу очень упрощенно как в Oracle (у тебя думаю аналогично): сервер получая запрос, разбирает его, выкидывая константы, т.е. запросы аналогичны
Если ты используешь запрос с параметром, а потом биндишь x, то серверу достаточно один раз разобрать запрос, а потом уже тупо подставлять разные x.
На этом экономится время. Если запрос уникальный, то преимущества использовать запрос с биндингом нет.
Запрос вида group by :x уже не катит, поскольку запросы вида
принципиально различные.
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
принципиально различные.
Ясно, значит в данной ситуации использовать параметры
а) не имеет смысла
б) не прокатит
а) не имеет смысла
б) не прокатит
Биндинг вроде еще нужен, чтобы обезопаситься от пользовательского ввода, т.е. чтобы пользователь sql-запрос вместо :x не подставил.
Ради этого и заморочено. На searchValue думаю можно забить, ибо там вычисляемый параметр, maskValue прилетает из формы, для него нужно, но с ним одним билдинг прокатит.
Оставить комментарий
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 +")";
в результате - то, что найдено по базе.
Но так делать как-то не айс.
Где я туплю с первым вариантом?