Java持久性:转换为Query.getResultList()的结果?
嘿大家,我是新手,坚持/hibernate,我需要你的帮助。
这是情况。 我有一个包含一些东西的表。 我们称他们为人。 我想从数据库中获取该表中的所有条目。
我有一个Person类,它是一个简单的POJO,表中的每一列都有一个属性(name,age,..)
这就是我所拥有的:
Query lQuery = myEntityManager.createQuery("from Person") List personList = lQuery.getResultList();
但是,我收到一条警告,说这是从List
到List
的未经检查的转换
我认为只需将代码更改为
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 。 我发现用户评论特别有趣。