当前位置: 首页 > 知识库问答 >
问题:

为什么createNativeQuery不返回TypedQuery?

柯默
2023-03-14

当我试图对泛型类型执行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。但是,即使保证可以工作,也会导致未检查的类型警告。

我见过有人建议通过从查询转到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那样正确地设置类型。从我的角度来看,这是不可接受的,因为不是每个SQL查询都可以用JPQL查询表示,所以有时我需要使用SQL,我希望返回一个TypedQuery。

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

共有1个答案

南门嘉
2023-03-14

这是因为createNamedQuery返回query而不是typedQuery ,即使在“typed result”变量中也是如此。https://docs.oracle.com/javaee/7/api/javax/persistence/query.html

 类似资料:
  • 问题内容: 我正在通过以下方式从Java代码启动Windows进程(用C ++编写,但没有源代码): 我的问题是,waitFor()方法永远不会结束。因此,我尝试在一个简单的shell中启动该过程,并以shell中的许多打印正确结束(我猜是标准输出)。 因此,即使我现在不需要这些输出,我还是决定创建并启动一个读取标准输出的线程。这解决了问题。 因此,我的问题是以下问题:该解决方案是“启动并等待具有

  • 我在客户端使用vue、vue路由器,在服务器端使用express、morgan(MEVN应用程序) 在客户端我用vue cookie设置cookie 在服务器端,我使用CookieParser 所以,在应用程序。我有这样的代码 并且,在文件中,我有这样一个GET请求的代码 问题是,var loginHash=req.cookies['Login'];总是返回未定义的,即使我有登录cookie 添加

  • 根据JSON规范,表示null值的正确方法是文字。 预期结果: 实际结果:

  • 问题内容: 以下是ajax请求。 这就是delete.php 运行代码后,它将成功删除文件,但不会显示任何消息。 我也尝试将ajax请求更改为: 仍然不显示该消息。所以我想在delete.php文件中出了点问题。请帮忙。 问题答案: 进行jquery + ajax + php的最佳方法如下: jQuery的: PHP:

  • 问题内容: 我正在编写一个PHP脚本,用于通过Linux shell命令使用PHP调用它来检查网络连接: 我没有从ping获得错误消息的输出,这是我期望的: 如果该域是一个很好的域,例如yahoo.com,则将ping中的输出输出到数组中。但是,如果这是一个错误,例如它不会返回到数组。 为什么会发生这种情况,有更好的方法吗? 问题答案: 您应该将stderr重定向到stdout。 为此,请像这样更

  • 为什么会 返回False,但是 不返回True,而是返回对象在内存中的位置。我找不到一种方法让这句话变为真,但我知道这是真的,因为: 返回"Yes!"。 正如我所说,这没有实际意义,至少目前没有,但它确实让我感到困惑。