命名查询中的Hibernate设置参数

时间:2012-01-27 04:25:29

标签: hibernate spring hql

我正在尝试编写一个可以获取命名查询的通用方法,在其中设置命名参数并返回结果。

该方法如下所示,

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,因此我必须选择此选项。任何帮助将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:3)

如果我理解你的问题。

在我的情况下,我经常使用q.getResultList来获取结果的集合 我认为这可以帮助您找到解决方案。

答案 1 :(得分:2)

你需要使用setParameterList(key,value),其中vale是你的列表。

答案 2 :(得分:1)

我怀疑你的问题的答案首先是在参数是列表类型时使用setParameterList方法;其次,使用以下技术之一:

  1. 使用反射来查询参数的类型,然后相应地使用setParameter或setParameterList方法。

  2. 使用多态的好处来捕获作为List对象的参数,并为这些参数调用setParameterList。示例如下。*

  3. 制作一个大的条件块,测试转换为一堆列表类型,如果它转换,则调用setParameterList,否则调用setParameter。

  4. (*)方法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
    }