Java Persistence: Cast to something the result of Query.getResultList()?

2022-09-01 03:32:42

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

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

我有一个 Person 类,它是一个简单的 POJO,表中每列都有一个属性(名称、年龄,..)

这是我所拥有的:

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

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

我认为只需将代码更改为

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

会工作..但事实并非如此。

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


答案 1

作为JPA的新手,我将此作为最终答案,但后来我通过这个问题找到了更好的答案:为什么在JPA中EntityManager查询会抛出NoResultException,但发现没有?

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

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

答案 2

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


抑制警告

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

是我见过的这个问题的唯一解决方案。抑制是丑陋的,但你可以相信JPA返回正确类型的对象,所以没有必要手动检查。

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

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

推荐