Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么createNativeQuery不返回TypedQuery?_Java_Jpa_Generics_Suppress Warnings - Fatal编程技术网

Java 为什么createNativeQuery不返回TypedQuery?

Java 为什么createNativeQuery不返回TypedQuery?,java,jpa,generics,suppress-warnings,Java,Jpa,Generics,Suppress Warnings,当我尝试执行泛型类型的TypedQuery时,Eclipse会发出未经检查的类型转换警告 我在这里使用泛型,因为在数据集中,由于查询和编辑的时间限制,每年都必须被划分到不同的表中。自1900年以来,表中有118年的数据,我想构建一个可以使用Java反射API每年进行扩展的系统。然而,这意味着在编译之前,我的父类不知道它们将在哪个子类或表上操作 下面是一些代码的示例,这些代码将导致未检查的警告,即使我通过TypedQuery指定了所有内容的类型。我拥有的代码将在我的数据库上编译并运行良好 publ

当我尝试执行泛型类型的TypedQuery时,Eclipse会发出未经检查的类型转换警告

我在这里使用泛型,因为在数据集中,由于查询和编辑的时间限制,每年都必须被划分到不同的表中。自1900年以来,表中有118年的数据,我想构建一个可以使用Java反射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保证用泛型类型实例化,因为它在任何地方都是相同的类型,一旦实例化就不能更改,因此编译器应该理解实体管理器也将返回类型为的TypedQuery。但是,它会导致未经检查的类型警告,即使它保证可以工作

我看到有人建议通过从一个查询转到TypedQuery来修复未检查的类型警告,但在这种情况下,这没有帮助。当我仍在做我想做的事情时,有没有办法避免这个警告

对于一个被删除的答案,我想澄清一点

em.createQuery(String)
em.createQuery(String, Class<T>)
em.createNativeQuery(String)
em.createNativeQuery(String, Class)
在这些选项中,第一个接受JPQL字符串并返回 通用查询。 选项2接受一个JPQL字符串和一个表示表的特定类 行,并返回TypedQuery。 选项3接受一个SQL字符串并返回一个通用查询。 选项4接受SQL字符串和表示表行的特定类, 为什么它返回一个泛型查询而不是TypedQuery? 在我看来,如果我给它一个适当类型的POJO,选项4应该像选项2为我做的那样,找出如何序列化它。事实上是这样,但它没有像选项2那样正确设置类型。从我的观点来看,这是不可接受的,因为不是每个SQL查询都可以用JPQL查询表示,所以有时我可能需要使用SQL,并且我希望返回一个TypedQuery

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

这是因为createNamedQuery返回的查询不是TypedQuery,即使在键入的结果变量中也是如此。

你到底从哪里得到警告?好的,有人删除了一个非常有用的答案,即使它没有直接回答这里的问题。我现在有一个新问题。当createQueryString类返回TypedQuery时,为什么EnityManager的createNativeQueryString类返回查询而不是TypedQuery。这意味着要么我必须通过不必要的步骤将结果显式转换为T,要么我必须处理代码中的警告。另外,我应该用这个更新这个问题,还是按照这些思路创建一个新问题?谢谢你至少尝试了一下,但我甚至在我的问题中说了这么多。也许你知道为什么他们决定返回一个普通的查询而不是TypedQuery。这个答案只是将问题的标题改为“为什么”改为“因为”。@PetrAleksandrov这是正确的,但要考虑到在iv发布该答案后标题发生了变化。