Параметры настройки гибернации в именованном запросе

Я пытаюсь написать общий метод, который может выбрать именованный запрос, установить в нем именованные параметры и вернуть результат.

Метод выглядит следующим образом,

s = getSession();
q = s.getNamedQuery(nameOfTheQuery);
keySet = queryParams.keySet();
itr = keySet.iterator();
while(itr.hasNext()){
    key = itr.next();
    //Problem here
    q.setParameter(key, queryParams.get(key));
    }
q.setMaxResults(maxResults);
q.setFetchSize(fetchSize);
log.info("::>>>> Query result :"+(q.uniqueResult()));

Я пытаюсь установить именованные параметры в значения здесь. Но когда параметр здесь оказывается списком или коллекцией, я получаю ClassCastException, а q.uniqueResult()

Есть ли способ написать этот метод для поддержки коллекций и других типов параметров? Я обязательно установил maxResults и fetchSize, поэтому мне пришлось выбрать эту опцию. Любая помощь будет принята с благодарностью. Спасибо!


person Abhishek    schedule 27.01.2012    source источник
comment
Если вы хотите получить правильный ответ на этот вопрос, я считаю, что вам нужно указать полный код всего метода (включая подпись метода). Это трудно следовать. Кроме того, поскольку вы сказали Naved, я хотел знать, как определить тип параметра или какой-либо механизм, чтобы найти его и изменить метод соответственно, вы должны поместить эту информацию где-нибудь в свой вопрос.   -  person Lisa    schedule 24.10.2013


Ответы (3)


Если я правильно понял ваш вопрос.

В моем случае я часто использую q.getResultList для получения коллекции результатов.
Я думаю, что это может помочь вам найти решение.

person Naved    schedule 27.01.2012
comment
Извините, Naved... Я хотел знать, как определить тип параметра или какой-либо механизм, чтобы найти его и соответствующим образом изменить метод. - person Abhishek; 27.01.2012
comment
Это потому, что ваш ответ неверен, но ответ setParameterList(key, value) мне кажется правильным. Поэтому я проголосовал за этот ответ. Это так просто. Но я ценю, что вы пытаетесь помочь, конечно. - person K.C.; 28.10.2013

Вам нужно использовать setParameterList (ключ, значение), где vale - ваш список.

person user463226    schedule 27.01.2012
comment
Извините, другими словами, как узнать, является ли параметр списком или какого он типа? - person Abhishek; 27.01.2012
comment
если (queryParams.get(key) instanceOf(List)) setParameterList() - person user463226; 27.01.2012
comment
Извините, вы на самом деле хотели бы более часто проверять значение instanceOf Collection - person user463226; 27.01.2012
comment
Кажется, это правильный ответ на вопрос. Я не понимаю, почему другой ответ получает так много голосов... - person K.C.; 17.10.2013

Я подозреваю, что ответ на ваш вопрос заключается в том, чтобы сначала использовать метод setParameterList, когда параметр является типом списка; во-вторых, с помощью одного из следующих методов:

  1. Используйте отражение, чтобы запросить тип ваших параметров, а затем используйте метод setParameter или setParameterList соответственно.

  2. Используйте преимущества полиморфизма для захвата параметров, являющихся объектами List, и вызывайте для них setParameterList. Пример ниже.*

  3. Создайте большой условный блок, который проверяет приведение к группе типов списков, и если он приводит, то вызовите setParameterList, в противном случае вызовите setParameter.

(*) Пример для подхода 2.

while(itr.hasNext()) 
{
    key = itr.next();
    QueryParameterHelper.setGenericParameter(q, key, queryParams.get(key));
}

public static class QueryParameterHelper
{
    public static void setGenericParameter(Query query, String paramName, List listValue)
    {
        query.setParameterList(paramName, listValue);   
    }

    public static void setGenericParameter(Query query, String paramName, String stringValue)
    {
        query.setParameter(paramName, stringValue);
    }

    //etc for other possible parameter types
}
person Lisa    schedule 24.10.2013