gpt4 book ai didi

java - 为什么 createNativeQuery 不返回 TypedQuery

转载 作者:太空宇宙 更新时间:2023-11-04 09:53:38 31 4
gpt4 key购买 nike

当我尝试执行通用类型的 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)
  1. 在这些选项中,第一个接受 JPQL 字符串并返回通用查询。
  2. 选项 2 接受 JPQL 字符串和表示表的特定类行,并返回 TypedQuery。
  3. 选项 3 接受 SQL 字符串并返回通用查询。
  4. 选项 4 接受一个 SQL 字符串和一个表示表行的特定类,为什么它返回通用查询而不是 TypedQuery?

在我看来,如果我给它一个适当类型的 POJO,选项 4 应该弄清楚如何序列化它,就像选项 2 为我做的那样。事实上确实如此,但它没有像选项 2 那样正确设置类型。从我的角度来看,这是 Not Acceptable ,因为并非每个 SQL 查询都可以由 JPQL 查询表示,因此有时我需要使用 SQL,并且我希望返回一个 TypedQuery。

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

最佳答案

因为createNamedQuery返回Query不是TypedQuery<T>即使在“键入结果”变体中也是如此。 https://docs.oracle.com/javaee/7/api/javax/persistence/Query.html

关于java - 为什么 createNativeQuery 不返回 TypedQuery<T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54411694/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com