【问题标题】:Hibernate setting parameters in named query命名查询中的休眠设置参数
【发布时间】:2012-01-27 04:25:28
【问题描述】:

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

方法如下所示,

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()));

我正在尝试将命名参数设置为此处的值。但是当这里的参数恰好是一个列表或集合时,我得到一个 ClassCastExceptionq.uniqueResult()

有没有办法我可以编写这个方法来支持集合和其他类型的参数?我必须设置 maxResults 和 fetchSize,所以我必须选择这个选项。任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 如果您想正确回答这个问题,我相信您需要输入整个方法的完整代码(包括方法签名)。很难跟上。另外,既然您对 Naved 说“我想知道如何确定参数的类型或某种机制来找到它并相应地更改方法”,您应该将该信息放在您的问题中的某个位置。

标签: hibernate spring hql


【解决方案1】:

如果我正确理解您的问题。

就我而言,我经常使用 q.getResultList 来获取结果的集合。
我认为这可能会帮助您找到解决方案。

【讨论】:

  • Sorry Naved...我想知道如何确定参数的类型或某种机制来找到它并相应地更改方法
  • 这是因为你的答案是错误的,但我认为答案“setParameterList(key, value)”是正确的。所以我赞成这个答案。就这么简单。但我很感激你当然想帮忙。
【解决方案2】:

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

【讨论】:

  • 对不起,我怎么知道参数是列表还是什么类型?
  • if (queryParams.get(key) instanceOf(List)) setParameterList()
  • 抱歉,您实际上希望更一般地检查值 instanceOf Collection
  • 这似乎是问题的正确答案。我不明白为什么另一个答案得到这么多票...
【解决方案3】:

我怀疑你的问题的答案是首先在参数为列表类型时使用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
}

【讨论】:

    猜你喜欢
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 2016-03-09
    • 1970-01-01
    相关资源
    最近更新 更多