【问题标题】:Java Persistence: Cast to something the result of Query.getResultList()?Java 持久性:转换为 Query.getResultList() 的结果?
【发布时间】:2010-10-31 17:45:17
【问题描述】:

大家好,我是persistence / hibernate的新手,我需要你们的帮助。

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

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

这就是我所拥有的:

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

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

我以为只要把代码改成

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

会工作..但它没有。

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

【问题讨论】:

    标签: java hibernate casting persistence


    【解决方案1】:

    替代方式:

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

    【讨论】:

    【解决方案2】:

    注意:这个答案在 JPA 2.0 中已经过时,它允许您指定预期的类型。见this answer


    抑制警告
    @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;
    }
    

    【讨论】:

      【解决方案3】:

      作为 JPA 的新手,我认为这是明确的答案,但后来我通过这个问题找到了一个更好的答案:Why in JPA EntityManager queries throw NoResultException but find does not?

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

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

      【讨论】:

      • Query 是一个抽象类型,所以如果你真的想要它,这里仍然可以是Query。无论如何,我更喜欢单行实现: ``` List personList = myEntityManager.createQuery("from Person", Person.class).getResultList(); ```
      【解决方案4】:

      嗯,有 java Collections 类解决方案,但你没有解释你的转换是如何失败的,或者它只是给出警告......

      这是验证这一点的一种方法:

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

      但如果你不需要验证它:

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

      【讨论】:

      • 我没有解释我的选角是如何失败的,因为它没有失败。它根本不会使警告静音..所以它什么都不做。
      【解决方案5】:

      我也被这个问题困扰了一段时间。您可以遍历列表并进行检查,但我希望噪音更少。我见过的解决此问题的最短方法是使警告静音,但我也对此感到非常不舒服。我有兴趣了解其他解决方案。

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

      嗯,在研究过程中,我在 java.net 上发现了一个有趣的 post。我发现用户 cmets 特别有趣。

      【讨论】:

        猜你喜欢
        • 2018-06-02
        • 1970-01-01
        • 1970-01-01
        • 2014-06-23
        • 1970-01-01
        • 1970-01-01
        • 2011-02-03
        • 2021-10-07
        • 1970-01-01
        相关资源
        最近更新 更多