当我尝试执行类型为通用的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)
在我看来,如果我给它一个相应类型的POJO,选项4应该弄清楚如何序列化它,就像Option 2对我一样。实际上它确实如此,但它没有像Option 2那样正确地设置类型。从我的观点来看,这是不可接受的,因为不是每个SQL查询都可以用JPQL查询来表示,所以有时我可能需要使用SQL ,我希望返回一个TypedQuery。
我已经通过切换到选项2解决了我的警告,但我仍然想知道答案以防万一我说,出现了一种情况,我将来不能使用选项2。
因为createNamedQuery
甚至在“打字结果”变体中返回Query
而不是TypedQuery<T>
。 https://docs.oracle.com/javaee/7/api/javax/persistence/Query.html