Предоставление переменного количества аргументов для хранимой процедуры / SQL - PullRequest
0 голосов
/ 18 мая 2011

У меня есть некоторая таблица базы данных, скажем, CarTb, и интерфейс, который позволяет вам просматривать подержанные автомобили, доступные для продажи.

В передней части я могу фильтровать как можно меньше или меньше - покажи мне все синие машины, покажи мне все красные машины с 4 дверями, покажи мне все машины с номером рего XXX123 ИЛИ ipod и пятью динамиками стерео. и т.д.

То, что я хочу делать на Java-сервере, - это построить систему, которая динамически запрашивает базу данных на основе того, что отправляет мне пользовательский интерфейс. Мне интересно, возможно ли динамически добавить целую строку аргументов в хранимый процесс ... Очевидно, я знаю, что вы можете отобразить отдельные аргументы, такие как doors =? а цвет =? а затем подставить в значения ... Но как насчет аргументов переменных, я полагаю, почти как Java vargs.

Вы всегда будете делать выборку * из CarTb, это просто предложение where может быть любым из следующих ...

  • ГДЕ двери = 4
  • ГДЕ двери = 5 И цвет = КРАСНЫЙ И МР3 = Y
  • ГДЕ турбо = Y ИЛИ обдув = Y

Вы поняли идею.

Есть предложения? У нас есть доступ к hibernate, если это помогает, и к базе данных sybase (т. Е. Мы можем написать другой сохраненный процесс, чтобы сделать это при необходимости).

- Ура, Дейв

Ответы [ 2 ]

0 голосов
/ 18 мая 2011

Я могу придумать один способ обмана, хотя я думаю / надеюсь, что запрос будет оптимизирован. Вы можете добавить дополнительные аргументы в подготовленный оператор для условий, которые вы хотели бы добавить, которые оцениваются как истинные, только если поле присутствует.

select ... 
  from ...
    where var1=? and <expression associated with that var1>  
    or var2=? and <expression associated with that var2>  
    or etc
0 голосов
/ 18 мая 2011

Вы можете динамически построить запрос, но при этом иметь doors=:param.Например:

if (doorsSelected) {
    clauses.add("doors=:doors");
    paramNames.add("doors");
    values.add(doors);
}

if (engineSelected) {
    clauses.add("engine=:engine");
    params.put("engine", engine);
}

Затем просто присоединитесь к списку предложений (например, используя Joiner в guava):

String queryString = Joiner.on(" AND ").join(clauses);
Query query = session.createQuery(queryString);

Затем выполните итерации params и query.setParameter(key, value)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...