Вопрос по hibernate sqlQuery with named parametres.
searchValue - название поля, как я понимаю, его как переменную нельзя передавать скорее всего (с хибернатом очень давно не работал)
Это сборное выражение типа substr(fieldName, 10, 5).
Не, я к тому, что там ожидается сиквельное выражение, и произвольную строку так подставить нельзя, что, в общем-то, правильно
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 +")";
в результате - то, что найдено по базе.
Но так делать как-то не айс.
Где я туплю с первым вариантом?