2011-12-28 80 views
4

使用createQuery().list之后可以避免强制转换警告吗?使用Hibernate避免类型安全警告Query.list()

//Type safety: The expression of type List needs unchecked conversion to conform to List<User> 
List<User> user = (List<User>) session.createQuery("select u from User u").list(); 

我希望找到指定的通过泛型参数或方法参数相符的目标对象,如下面的方法:

List<User> user = session.createQuery("select u from User u").list(User.class); 
+1

看来伤心的答案是,有通过Hibernate API这样的不容易/清洁方式。如果有意识的话,我们会从设计理由中深入了解为什么会出现这种情况。 – dcompiled 2011-12-28 03:22:44

回答

4

最重要的是要记住警告是由于你的编译器,而不是休眠 - 你可以告诉你的编译器忽略未实现的泛型。通过使用HQL,我们以类型安全的方式查询数据,不幸的是,java不具备验证功能。

有很多,如果方法可以解决休眠铸造的语法丑陋,如:

1)使用@SuppressWarnings其中铸造或

2)使用Collections.checkedList方法来创建新名单。

参见:How to avoid type safety warnings with Hibernate HQL results?

+0

我在进一步搜索后发现此问题。会很快找到它,但我正在寻找“强类型化的hibernate查询”。 – dcompiled 2011-12-28 03:21:52

1

可以避开警告如果您使用的EntityManager,但不知道如果它使任何事情更好:

EntityManager em = provider.get(); // your code will probably be different here 
CriteriaBuilder builder = em.getCriteriaBuilder(); 
CriteriaQuery<T> query = builder.createQuery(type); // your Class<T> 
Root<T> root = query.from(type); // your Class<T> 
query.select(root); 
TypedQuery<T> typedQuery = em.createQuery(query); 
typedQuery.getResultList(); // List<T> 

编辑:明显,有更好的设定日的方式是出...