当前位置: 首页 > 面试题库 >

将Hibernate Query.list()强制转换为List的“正确”方法是什么?

曾嘉荣
2023-03-14
问题内容

我是Hibernate的新手,并且正在编写一个简单的方法来返回与特定过滤器匹配的对象列表。List<Foo>似乎是自然的回报类型。

不管我做什么,除非聘用了丑陋的人,否则似乎都无法使编译器满意@SuppressWarnings

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

我想摆脱它SuppressWarnings。但是如果我这样做,我会得到警告

Warning: Unchecked cast from List to List<Foo>

(我可以忽略它,但是我不想一开始就得到它),如果我删除泛型以符合.list()返回类型,则会收到警告

Warning: List is a raw type. References to generic type List<E>
should be parameterized.

我注意到org.hibernate.mapping 确实 声明了List;但这是完全不同的类型- Query返回a
java.util.List作为原始类型。我发现最近的Hibernate(4.0.x)无法实现参数化类型很奇怪,所以我怀疑是我自己在做错什么。

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

我也看过Hibernate Class CastException,因为它看起来很有希望,但是后来我意识到我实际上并 没有 得到任何Exception…我的问题只是一个警告的问题-
如果可以的话,是一种编码样式。

关于jboss.org的文档,Hibernate手册和一些教程似乎没有 如此
详细地涵盖该主题(或者我没有在正确的位置搜索?)。当他们确实进入细节时,他们会使用即时转换-
以及不在jboss.org官方网站上的教程中使用的转换,因此我有些警惕。

代码一旦编译,就不会 出现明显的 问题……我知道……。结果是预期的。

所以:我这样做对吗?我是否缺少明显的东西?有“正式”或“推荐”的 方式 吗?


问题答案:

简短的答案@SuppressWarnings是正确的方法。

长话大说,Hibernate
List从该Query.list方法返回了一个原始数据,请参见此处。这不是Hibernate的错误,也不是可以解决的问题,查询返回的类型在编译时
未知

因此,当你写

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

您正在执行从List到的不安全转换List<MyObject>-无法避免。

您可能无法安全地执行转换,因为其中List 可能 包含任何内容。

使错误消失的唯一方法是更加丑陋

final List<MyObject> list = new LinkedList<>();
for(final Object o : query.list()) {
    list.add((MyObject)o);
}


 类似资料:
  • 问题内容: 我是Hibernate的新手,并且正在编写一个简单的方法来返回与特定过滤器匹配的对象列表。似乎是自然的回报类型。 不管我做什么,除非雇用了ugly,否则我似乎都无法使编译器满意。 我想摆脱它。但是如果我这样做,我会得到警告 (我可以忽略它,但是我不想一开始就得到它),如果我删除泛型以符合返回类型,则会收到警告 我注意到 确实 声明了;但它是完全不同的类型- 返回a 作为原始类型。我发现

  • 问题内容: 最近,sonatype启用了Maven Central以支持https(背景信息)。现在,我在pom.xml中添加了以下代码段,以在所有地方强制使用https: 问题: 这够了吗?还是在某个地方仍然包含http? 这是正确的做法吗?如我所读,我应该在settings.xml中执行此操作。但是,其他使用我的(开源)项目的人将不会使用安全连接。 更新资料 它看起来还不够,例如,仍然使用HT

  • 最近,sonatype使maven central支持https(背景信息)。现在,我在pom.xml中添加了以下片段,以强制在任何地方使用https: null 它看起来是不够的,例如,仍然使用了程序集插件HTTP:

  • 问题内容: 所以这工作: 但这不是: 总而言之,我得到了第一部分(拳击),但是我发现第二部分不起作用是非常不直观的。是否有特定的原因(除了String从Object继承而int不从Object继承)? 编辑: 为了完善我的问题,这也可以: 但是,以下内容却没有: 令人惊讶的是,您遇到了与String相同的问题: 在最后一行产生类强制转换异常。仍然有效: 问题答案: 我刚刚找到了我正在寻找自己的答案

  • 明确的强制转换 明确的 强制转换指的是明显且明确的类型转换。对于大多数开发者来说,有很多类型转换的用法可以清楚地归类于这种 明确的 强制转换。 我们在这里的目标是,在我们的代码中指明一些模式,在这些模式中我们可以清楚明白地将一个值从一种类型转换至另一种类型,以确保不给未来将读到这段代码的开发者留下任何坑。我们越明确,后来的人就越容易读懂我们的代码,也不必费太多的力气去理解我们的意图。 关于 明确的

  • 问题内容: 我有MainActivity类,该类具有实例化ApplicationBar的方法,所有其他Activity都从此继承,因此他们可以使用此方法。 但是我也有一个MapHolder类,它必须从xml中扩展,因为它使用来显示地图。问题是如果我从不显示ApplicationBar选项卡扩展它,并且从MainActivity扩展它而不显示地图,则出现此错误: 问题答案: 您正在尝试将a强制转换为