当我尝试执行通用类型的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)
在我看来,如果我给它提供适当类型的POJO,则选项4应该像选项2一样,弄清楚如何对其进行序列化。实际上可以,但是不能像选项2那样正确设置类型。从我的角度来看,这是不可接受的,因为并不是每个SQL查询都可以由JPQL查询表示,因此有时我需要使用SQL ,并且我希望返回TypedQuery。
我已经解决了通过切换到选项2发出的警告,但是我仍然想知道答案,以防万一出现将来我无法使用选项2的情况。
答案 0 :(得分:0)
这是因为createNamedQuery
返回Query
而不是TypedQuery<T>
的情况是“键入结果”变体。
https://docs.oracle.com/javaee/7/api/javax/persistence/Query.html