Java持久性:转换为Query.getResultList()的结果?

嘿大家,我是新手,坚持/hibernate,我需要你的帮助。

这是情况。 我有一个包含一些东西的表。 我们称他们为人。 我想从数据库中获取该表中的所有条目。

我有一个Person类,它是一个简单的POJO,表中的每一列都有一个属性(name,age,..)

这就是我所拥有的:

Query lQuery = myEntityManager.createQuery("from Person") List personList = lQuery.getResultList(); 

但是,我收到一条警告,说这是从ListList的未经检查的转换

我认为只需将代码更改为

 Query lQuery = myEntityManager.createQuery("from Person") List personList = (List)lQuery.getResultList(); 

会工作..但它没有。

有没有办法做到这一点 ? 持久性是否允许我设置查询的返回类型? (通过generics可能吗?)

作为JPA的新手,这是一个明确的答案,但后来我通过这个问题找到了一个更好的答案: 为什么在JPA EntityManager查询中抛出NoResultException但是却找不到?

它就像使用TypedQuery而不是Query一样简单,例如:

 TypedQuery lQuery = myEntityManager.createQuery("from Person", Person.class); List personList = lQuery.getResultList(); 

注意:此答案从JPA 2.0开始已过时,它允许您指定预期的类型。 看到这个答案 。


抑制警告

 @SuppressWarnings("unchecked") List result = (List) query.getResultList(); 

是我见过的这个问题的唯一解决方案。 抑制是丑陋的,但您可以信任JPA返回正确类型的对象,因此无需手动检查。

如果您使用多态并且不知道确切的结果类型,则使用带有有界Class参数的generics也是一种常见模式:

 public List findMyType(Class type) { @SuppressWarnings("unchecked") List result = (List) this.entityManager.createQuery( "FROM " + type.getName()) .getResultList(); return result; } 

那么有Java Collections类解决方案,但你没有解释你的转换是如何失败的,或者它是否只是发出警告……

这是validation这一点的一种方法:

 Collections.checkList(lQuery.getResultList(), Person.class); 

但是如果你不需要validation它:

 @SuppressWarnings("unchecked") List personList = lQuery.getResultList(); 

替代方式:

 Query query = entityManager.createNativeQuery("SELECT * FROM person", Person.class); List rows = query.getResultList(); 

我也一直坚持这个问题。 您可以遍历列表并检查,但我更喜欢噪音。 我看到绕过这个最短路的方法是让警告静音,但我也很不舒服。 我有兴趣看到其他解决方案。

 @SuppressWarnings("unchecked") List personList = lQuery.getResultList(); 

嗯,在研究时我在java.net上发现了一篇有趣的post 。 我发现用户评论特别有趣。