当我想启动Hibernate应用程序时,我总是得到类型安全警告。有没有一种方法可以在不使用@SuppressWarnings("unchecked")
的情况下摆脱这种情况?
这是我的代码:
Configuration config = new Configuration();
config.addAnnotatedClass(Employee.class);
config.configure("hibernate.cfg.xml");
new SchemaExport(config).create(false, false);
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(config.getProperties()).build();
SessionFactory factory = config.buildSessionFactory(serviceRegistry);
Session session = factory.getCurrentSession();
session.beginTransaction();
Query q = session
.createQuery("SELECT e.empId,e.empName FROM Employee e");
@SuppressWarnings("unchecked")
List<Object[]> list = q.list(); <-- here is the problem!
答案 0 :(得分:16)
Hibernate的Session.list()
返回一个简单的原始List
。
将它转换为参数化集合(List<Object[]>
此处)是完全合法的Java语法。但由于通用类型信息在运行时被清除,编译器将发出警告,告诉您它无法保证此转换实际上是有效的。
所以这只是告诉你的方式“嘿,你在这里玩火,我希望你知道你做了什么,因为我没有。”
在这种特殊情况下,您无法做任何事情来消除此警告,但您可以通过使用@SuppressWarnings
注释明确忽略它。
答案 1 :(得分:1)
另一个重载的 createQuery()
方法的接受结果类型。
createQuery(String queryString, Class<T> resultType)
我不知道哪个休眠版本添加了它。
实际上,使用 @SuppressWarnings
的结果相同。
List<Employee> emp = session.createQuery("from Employee", Employee.class).getResultList();
顺便说一下,在 Hibernate 5.2 中 list() 已被弃用。
答案 2 :(得分:0)
不,除非你将a.list()完全设为List<Object[]>
答案 3 :(得分:0)
你可以强制强制转换使警告消失,但很像抑制警告它隐藏了一个潜在的问题,因为q.list()不能保证返回那个确切的类型。
List<Object[]> list = (List<Object[]>)q.list();