为什么createNativeQuery不返回TypedQuery ?

问题描述 投票:0回答:1

当我尝试执行类型为通用的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);
   }
}

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

我见过人们建议通过从Query到TypedQuery修复未经检查的类型警告,但在这种情况下这没有帮助。有没有办法避免这种警告,同时还在做我想做的事情?

在回答被删除的答案时,我想澄清一些事情。

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

在我看来,如果我给它一个相应类型的POJO,选项4应该弄清楚如何序列化它,就像Option 2对我一样。实际上它确实如此,但它没有像Option 2那样正确地设置类型。从我的观点来看,这是不可接受的,因为不是每个SQL查询都可以用JPQL查询来表示,所以有时我可能需要使用SQL ,我希望返回一个TypedQuery。

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

java jpa generics suppress-warnings
1个回答
0
投票

因为createNamedQuery甚至在“打字结果”变体中返回Query而不是TypedQuery<T>https://docs.oracle.com/javaee/7/api/javax/persistence/Query.html

© www.soinside.com 2019 - 2024. All rights reserved.