Hibernate在命名查询中设置参数

发布于 2024-12-29 01:22:13 字数 644 浏览 2 评论 0原文

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

该方法如下所示,

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

I am trying to write a generic method that can pick up a named query, set the named parameters in it and return a result.

The method looks like the following,

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

I am trying to set the named parameters to values here. But when the parameter here happens to be a list or collection I get a ClassCastException while the q.uniqueResult()

Is there a way I can write this method to support collections and other types of parameters as well? It is mandatory that I set the maxResults and fetchSize so I had to choose this option. Any help would be greatly appreciated. Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

时间海 2025-01-05 01:22:13

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

You need to use setParameterList(key, value) where vale is your list.

夏日落 2025-01-05 01:22:13

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

I suspect the answer to your question is firstly to use the setParameterList method when the parameter is a list type; secondly by using one of the following techniques:

  1. Use reflection to interrogate the type of your parameters and then use setParameter or setParameterList method accordingly.

  2. Use the benefits of polymorphism to capture parameters that are List objects and call setParameterList for those. Example below.*

  3. Make a big conditional block that tests casting to a bunch of list types and if it casts then call setParameterList, otherwise call setParameter.

(*) Example for approach 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
}
北方的巷 2025-01-05 01:22:13

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

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

If I understand your question correctly.

In my case I often use q.getResultList to get the collection of the result.
I think this may help you to find the solution.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文