Необязательный параметр с setParameterList в HQL - PullRequest
2 голосов
/ 28 сентября 2011

У меня запрос с необязательным параметром

"SELECT ClinicId,Name from Clinic where :ClinicIds is NULL OR ClinicId IN :ClinicIds"

List<int> ClinicIds = null;

Я передаю параметр следующим образом

q.SetParameterList("ClinicIds", ClinicIds);

Поскольку ClinicId является необязательным параметром.Если я передаю ноль в SetParameterList, я получаю исключение.Любая идея, как я могу передать необязательный параметр (нулевое значение) в SetParameterList.

Спасибо

Ответы [ 3 ]

3 голосов
/ 28 сентября 2011

Вместо использования HQL используйте запрос Criteria. Он разработан, чтобы быть более программным, чем HQL, так как вы используете прямой Java-код для сборки вашего запроса, что позволяет вам использовать логику if-then. Таким образом, вместо того, чтобы объединять HQL или иметь два разных HQL-запроса, которые необходимо поддерживать независимо, у вас есть один Criteria запрос, который учитывает обе ситуации. Пример:

//SELECT ClinicId,Name from Clinic where :ClinicIds is NULL OR ClinicId IN :ClinicIds
Criteria criteria = getSession().createCriteria(Clinic.class);
if(ClinicIds == null) {
    criteria.add(Restrictions.eq("ClinicId", null));
} else {
    criteria.add(Restrictions.or(
            Restrictions.eq("ClinicId", null), 
            criteria.add(Restrictions.in("ClinicId", ClinicIds));
        )
    );
}
return criteria.list();
1 голос
/ 28 сентября 2011

Вы не можете. Это приведет к неверному SQL.

Вам нужно изменить HQL в зависимости от того, есть ли ClinicIds.

0 голосов
/ 17 мая 2012

Я сделал это так:

"SELECT ClinicId,Name from Clinic where -1 in (:ClinicIds)  OR ClinicId IN :ClinicIds"

и

if(ClinicIds == null or ClinicIds.isEmpty()){
    ClinicIds = new List<int>();
    ClinicIds.add(-1);
}

q.SetParameterList("ClinicIds", ClinicIds);

просто трюк

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