我是Hibernate的新手,我正在编写一个简单的方法来返回与特定过滤器匹配的对象列表<代码>列表
无论我做什么,我似乎都不能让编译器满意,除非我使用一个丑陋的@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();
}
}
我想摆脱那种抑制警告
。但如果我这么做了,我会得到警告
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。冬眠映射
确实声明了一个列表
;但它是一种完全不同的类型——Query
返回一个java。util。以原始类型列出
。我觉得奇怪的是,最近的Hibernate(4.0.x)没有实现参数化类型,所以我怀疑是我做错了什么。
它看起来非常像将Hibernate结果强制转换为对象列表,但这里没有“硬”错误(系统知道Foo类型,我使用的不是SQLQuery,而是直接查询)。所以没有快乐。
我还研究了Hibernate类强制转换异常,因为它看起来很有希望,但后来我意识到我实际上没有得到任何异常。。。我的问题只是一个警告——一种编码风格,如果你愿意的话。
关于jboss的文档。org、Hibernate手册和一些教程似乎没有如此详细地介绍这个主题(或者我没有在正确的地方搜索?)。当他们进入细节时,他们会使用即时播放——这是官方jboss上没有的教程。org网站,所以我有点警惕。
代码一旦被编译,运行起来没有明显的问题...据我所知...然而;结果是预期的。
那么:我做得对吗?我是不是漏掉了什么明显的东西?有“官方”或“推荐”的方法吗?
回答你的问题,没有“正确的方法”来做到这一点。现在,如果只是警告让您感到困扰,避免其扩散的最佳方法是将Query.list()
方法包装成DAO:
public class MyDAO {
@SuppressWarnings("unchecked")
public static <T> List<T> list(Query q){
return q.list();
}
}
这样,您只需使用一次@SuppressWarnings(“未选中”)
。
解决方案是改用TypeQuery。当从EntityManager创建查询时,请这样调用它:
TypedQuery<[YourClass]> query = entityManager.createQuery("[your sql]", [YourClass].class);
List<[YourClass]> list = query.getResultList(); //no type warning
这同样适用于命名查询、本机命名查询等。相应的方法与将返回普通查询的方法具有相同的名称。只要知道返回类型,就用它代替查询。
简短的回答@SuppressWarnings
是正确的方法。
很长的回答,Hibernate从Query.list
方法返回一个原始的List
,请参阅此处。这不是Hibernate的错误或可以解决的问题,查询返回的类型在编译时是未知的。
所以当你写作的时候
final List<MyObject> list = query.list();
您正在从列表
到列表进行不安全的转换
由于
列表
可能包含任何内容,因此您无法安全地执行演员阵容。
唯一能让错误消失的方法就是让错误变得更加丑陋
final List<MyObject> list = new LinkedList<>();
for(final Object o : query.list()) {
list.add((MyObject)o);
}
问题内容: 我是Hibernate的新手,并且正在编写一个简单的方法来返回与特定过滤器匹配的对象列表。似乎是自然的回报类型。 不管我做什么,除非雇用了ugly,否则我似乎都无法使编译器满意。 我想摆脱它。但是如果我这样做,我会得到警告 (我可以忽略它,但是我不想一开始就得到它),如果我删除泛型以符合返回类型,则会收到警告 我注意到 确实 声明了;但它是完全不同的类型- 返回a 作为原始类型。我发现
问题内容: 我是Hibernate的新手,并且正在编写一个简单的方法来返回与特定过滤器匹配的对象列表。似乎是自然的回报类型。 不管我做什么,除非聘用了丑陋的人,否则似乎都无法使编译器满意。 我想摆脱它。但是如果我这样做,我会得到警告 (我可以忽略它,但是我不想一开始就得到它),如果我删除泛型以符合返回类型,则会收到警告 我注意到 确实 声明了;但这是完全不同的类型- 返回a 作为原始类型。我发现最
问题内容: 即使在使用Java Swing一年以上之后,对我来说,它仍然像魔术一样。如何正确使用BufferStrategy,尤其是方法? 我想添加一个JFrame和一个Canvas,然后进行绘制。我还希望能够调整()画布的大小。每次我调整Canvas的大小时,似乎都会被浪费掉,或者变得毫无用处,因为在上使用并没有真正做任何事情。另外,它具有怪异的不确定性行为,我不知道如何正确同步它。 这就是我的
问题内容: 我想在Linux上使用该机制。我希望我的应用程序知道何时更改了文件。能否请您提供给我一个示例,该怎么做? 问题答案: 文档(来自具有inotify的Monitor文件系统活动) 在C API 提供了三个系统调用来构建各种文件系统监视器: 在内核中创建子系统的实例,并在成功和失败时返回文件描述符。与其他系统调用一样,如果失败,请检查诊断。 顾名思义,它增加了一块 手表 。每个监视都必须提
问题内容: 需要帮助,以了解如何在UIKit中使用prepareForReuse()。该文件说 您只应重置与内容无关的单元格属性,例如Alpha,编辑和选择状态 但是如何重置单个属性属性(例如isHidden)呢? 假设我的单元格有2个标签,我应该在哪里重置: 标签文本 label.numberOfLines label.isHidden 我的tableView(_:cellForRowAt :)
一段时间以来,我一直试图将我的tableview工作作为一种电子表格,通过背景线程进行更新,当单元格更新时,它会亮起几秒钟(更改样式),然后返回到原始样式。我已经知道,我不能直接在表格单元格中存储和设置样式,我需要某种支持类来保存这些数据。但是tableview“重用”单元格(使用相同的单元格处理不同的数据)的行为真的很奇怪。当所有单元格都适合屏幕时,它对我来说完美无瑕,但一旦我放置大约100个单