当我尝试执行通用类型的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,因为它在任何地方都是相同的类型,并且一旦实例化就无法更改,因此编译器应理解,实体管理器将返回类型的TypedQuery也一样但是,即使保证可以正常工作,它也会导致未经检查的类型警告。

我见过有人建议通过从Query到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即使在“类型化结果”变体中也返回Query而不是TypedQuery<T>
https://docs.oracle.com/javaee/7/api/javax/persistence/Query.html

10-04 11:37