为什么createNativeQuery不返回TypedQuery <t>?

时间:2019-01-28 23:19:33

标签: java jpa generics suppress-warnings

当我尝试执行通用类型的TypedQuery时,我收到来自Eclipse的未经检查的类型转换警告。

我在这里使用泛型,因为在数据集中,由于查询和编辑的时间限制,每年都必须分成不同的表。该表中有118年的数据(自1900年以来),我想构建一个可以使用Java Reflections API进行扩展的系统。但是,这意味着在编译之前,我的父类不知道它们将在哪个子类或表上进行操作。

这是一些代码的示例,即使我通过TypedQuery指定所有内容是什么类型,也将导致未经检查的警告。我拥有的代码可以编译并在数据库上正常运行。

public class MyParentRepository<T extends MyParentPojo>
{
   @PersistenceContext
   private EntityManager em;

   private Class<T> tea;

   public MyParentRepository(Class<T> tea)
   {
      this.tea = tea;
   }

   public void giveWarning(int year)
   {
      String sql = String.format("SELECT * FROM mytable%d t", year);

      TypedQuery<T> resultSet = (TypedQuery<T>) em.createNativeQuery(sql, tea);
   }
}

预期结果是,由于保证可以使用泛型类型实例化tea,因为它在任何地方都是相同的类型,并且一旦实例化就无法更改,因此编译器应理解,实体管理器将返回a类型的TypedQuery也是如此。但是,即使保证可以正常工作,它也会导致未经检查的类型警告。

我已经看到人们建议通过从Query到TypedQuery来修复未检查的类型警告,但这在这种情况下无济于事。有没有办法在仍然做我想做的事情的同时避免这种警告?

针对被删除的答案,我想澄清一下。

em.createQuery(String)
em.createQuery(String, Class<T>)
em.createNativeQuery(String)
em.createNativeQuery(String, Class)
  1. 在这些选项中,第一个使用JPQL字符串并返回一个 通用查询。
  2. 选项2接收JPQL字符串和代表表的特定类 行,并返回TypedQuery。
  3. 选项3接收一个SQL字符串并返回一个通用查询。
  4. 选项4接收一个SQL字符串和一个代表表行的特定类, 为何返回通用查询而不是TypedQuery?

在我看来,如果我给它提供适当类型的POJO,则选项4应该像选项2一样,弄清楚如何对其进行序列化。实际上可以,但是不能像选项2那样正确设置类型。从我的角度来看,这是不可接受的,因为并不是每个SQL查询都可以由JPQL查询表示,因此有时我需要使用SQL ,并且我希望返回TypedQuery。

我已经解决了通过切换到选项2发出的警告,但是我仍然想知道答案,以防万一出现将来我无法使用选项2的情况。

1 个答案:

答案 0 :(得分:0)

这是因为createNamedQuery返回Query而不是TypedQuery<T>的情况是“键入结果”变体。 https://docs.oracle.com/javaee/7/api/javax/persistence/Query.html