Spring jdbcTemplate динамическое предложение where

Можно ли сгенерировать произвольный SQL-запрос where condtions через шаблон Jdbc:

пример:

Если я передаю значение для 1 параметра (только имя): поиск по имени

"select * from address where shopname = ?";

Если я передаю значение для 2 параметров (имя и город) - поиск по названию магазина и городу:

"select * from address where shopname = ? and city = ?";

У меня несколько полей поиска. 7 полей. Если пользователь вводит любую комбинацию. у меня поиск только по параметру. Как динамически передавать параметры в sql. Нужен фрагмент / пример, как этого добиться.


person minil    schedule 22.05.2011    source источник


Ответы (4)


Вам нужен какой-то API для построения критериев, который есть в Hibernate. К сожалению, я не думаю, что в Spring JdbcTemplate есть такая возможность. Другие поправят меня, если я ошибаюсь ...

person hvgotcodes    schedule 22.05.2011

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

String sql = "select * from address where 1 = 1";

if(shopname != null)
  sql += "and shopname = :shopname";

if(city!= null)
  sql += "and city = :city";

и так далее ... и используйте NamedParameterJdbcTemplate

person Jainesh kumar    schedule 26.05.2018
comment
... и используйте StringBuilder () вместо конкатенации строк :) - person Slava Semushin; 12.10.2018

Spring Data и Hibernate имеют такую ​​функциональность. Хотя, возможно, не стоит тащить такое большое фреймворк для вашего приложения.

Вы можете попробовать проверить SimpleJdbcInsert http://docs.spring.io/spring/docs/current/spring-framework-reference/html/jdbc.html

Изменить: В качестве альтернативы вы можете попытаться исправить это в SQL с проверкой пустого значения, но если у вас есть много данных, которые нужно пройти, этот метод замедлит ваш запрос.

"select * from address 
where (shopname = ? or shopname = null)
 and (city = ? or city = null)";
person Tzen    schedule 17.03.2015

Если вам подходит Scala, запрос можно построить примерно так:

case class Search(shopname:String, city:String = None) {
 def sql = "select * from address where shopname = '"+shopname+"'" + city.map(" and city = '"+
      _ +"'").getOrElse("")  
}

Пример использования:

Search("lloh").sql
Search("lloh", Some("Austin")).sql
person eptx    schedule 26.05.2011
comment
Я не знаком со Scala, но исходя из конкатенации строк в этом предлагаемом подходе, я бы посоветовал избегать этого подхода, чтобы избежать возможности атак с использованием SQL-инъекций. - person Kevin Hooke; 08.11.2012
comment
Это было бы очень небезопасно из-за рисков внедрения SQL-кода. - person BrianC; 23.05.2014