当前位置: 首页 > 知识库问答 >
问题:

将Hibernate query.list()转换为列表的“适当”方法是什么?

岳谦
2023-03-14

我是一个使用Hibernate的新手,我正在编写一个简单的方法来返回匹配特定过滤器的对象列表。列表 似乎是一种自然的返回类型。

import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;

public class Foo {

    public Session acquireSession() {
        // All DB opening, connection etc. removed,
        // since the problem is in compilation, not at runtime.
        return null;
    }

    @SuppressWarnings("unchecked") /* <----- */

    public List<Foo> activeObjects() {
        Session s = acquireSession();
        Query   q = s.createQuery("from foo where active");
        return (List<Foo>) q.list();
    }
}
Warning: Unchecked cast from List to List<Foo>
Warning: List is a raw type. References to generic type List<E>
should be parameterized.

我注意到org.hibernate.mapping确实声明了一个列表;但它完全是一种不同的类型-query作为原始类型返回java.util.list。我觉得奇怪的是,最近的Hibernate(4.0.x)没有实现参数化类型,所以我怀疑是我做错了什么。

它看起来非常像将Hibernate结果转换为对象列表,但这里没有“硬”错误(系统知道类型Foo,我使用的不是SQLQuery,而是直接查询)。所以没有欢乐。

我还查看了Hibernate类强制转换异常,因为它看起来很有希望,但后来我意识到我实际上没有得到任何异常...我的问题只是一个警告--一种编码风格,如果你愿意的话。

jboss.org上的文档、Hibernate手册和几个教程似乎没有详细地介绍这个主题(或者我没有在正确的地方搜索?)。当他们进入细节的时候,他们会使用即时转换--这是官方jboss.org站点上没有的教程,所以我有点谨慎。

代码一经编译,运行起来没有明显的问题。据我所知...然而;并取得了预期的效果。

所以:我这样做对吗?我是不是漏掉了什么明显的东西?有没有“官方”或“推荐”的方式去做?

共有1个答案

谢鸿羲
2023-03-14

简答@suppresswarnings是正确的方法。

长答案,Hibernate从query.list方法返回一个原始的list,请参阅此处。这不是Hibernate的bug或其他可以解决的问题,查询返回的类型在编译时是未知的。

所以当你写的时候

final List<MyObject> list = query.list();

您无法安全地执行强制转换,因为列表可能包含任何内容。

使错误消失的唯一方法是更难看的

final List<MyObject> list = new LinkedList<>();
for(final Object o : query.list()) {
    list.add((MyObject)o);
}
 类似资料:
  • 问题内容: 我有一个函数,其输入参数可以是一个元素或元素列表。如果此参数是单个元素,则将其放在列表中,以便可以以一致的方式遍历输入。 目前我有这个: 我正在使用现有的API,因此无法更改输入参数。使用isinstance()感觉很麻烦,所以有 适当的 方法吗? 问题答案: 我喜欢Andrei Vajna的建议。请注意以下一些典型的Python类型的结果: 这具有将字符串视为不可重复的额外优势-字符

  • 问题内容: 在Python中将list with转换为list with的最简单方法是什么?例如,我们必须转换为。当然,我们可以使用循环,但这太简单了。 问题答案: Python 2.x: Python 3.x(在3.x中,返回迭代器,而不是在2.x中的列表): 资料:2.6,3.1

  • 我有一个lambda表达式,我想在其中创建一个对象列表,但我得到了错误 错误 我希望作为lambda表达式的返回类型。我怎样才能做到呢?

  • 问题内容: JDK或Google Guava中是否有类似这种方法 例如,如果某些东西返回空列表,这很容易在增强循环中不崩溃 不会崩溃。 我环顾四周,却找不到任何这样的方法,我想知道我是否错过了它,或者是否有这样的原因导致这种方便的方法不方便使用,因此不包括在内? 问题答案: Objects.firstNonNull(list, ImmutableList. of()); 不需要专门的方法,实际上,

  • 问题内容: 有一个对象,是否有比列表理解更快,更好或更正确的方法来获取迭代器返回的对象的列表? 问题答案:

  • 问题内容: 说我有: 现在,我要将int值转换为String。哪种方法更有效? 我只是好奇是否有真正的区别,或者一个比另一个更好? 问题答案: 测试了10m分配的数字10 一个似乎赢了 编辑:JVM是Mac OS X 10.5下的标准’/ usr / bin / java’ 更多编辑: 要求的代码 情况2和3同样 使用