【问题标题】:entityManager.createNativeQuery does not return a typed resultentityManager.createNativeQuery 不返回类型化结果
【发布时间】:2019-06-04 04:38:12
【问题描述】:

我需要使用 entityManager 选择 本机查询。我找到了方法:

public Query createNativeQuery(String sqlString, Class resultClass);

并尝试使用它:

Query query = em.createNativeQuery(readyQuery, SmevMessage.class);
return query.getResultList();

但 IDE 仍然突出显示为警告:

那么为什么会存在这种方法呢?我应该怎么做才能解决它?

【问题讨论】:

  • 这是警告而不是错误。您无法修复它,因为这里的 API 不一致。 Query 不是。如果您查看 createQuery 方法(对于 JPQL),它会返回 TypedQuery 而不是这个。您可以使用 @SuppressWarning 注释来隐藏警告,但这就是您所能做的。
  • 是的,当我使用TypedQuery q = em.createQuery() 时没有警告。但是方法不同public Query createNativeQuery(String sqlString);public Query createNativeQuery(String sqlString, Class resultClass);? - resultClass 好像在暗示我应该输入类型
  • 如前所述,createQuery 用于 JPQL... 我提到它是为了强调 EntityManager 的 API 中的不一致。
  • 您的持久性提供程序实例化提供的resultClass 的托管实体对象,并在您调用getSingleResultgetResultList 方法时返回它们。但正如我在下面的回答中所解释的,该方法只返回一个无类型的Query。这就是您的 IDE 显示警告的原因,您可以忽略它。

标签: java jpa entitymanager


【解决方案1】:

您会收到哪个警告?您的 IDE 是否只警告您返回的 List 的未经检查的转换?

你可以忽略那个。不幸的是,createNativeQuery 方法返回一个无类型的Query。您无法修复该警告。如果它真的困扰你,你可以用@SuppressWarnings("unchecked") 压制它。

请注意,您需要提供一个实体类作为resultClass 参数的值,正如我在here 中解释的那样。因此,在您的情况下,SmevMessage 必须是一个实体。如果要将查询结果映射到 DTO,则需要 define an @SqlResultSetMapping

【讨论】:

  • 现在很清楚了。 JPA 需要第二个参数来了解在哪个实体映射中。但目前尚不清楚为什么仍然无法生成类型化结果。我不想压制警告。我也可以离开。让它突出显示。我只是想知道为什么还没有决定。
猜你喜欢
  • 2018-05-09
  • 1970-01-01
  • 2022-07-31
  • 2020-01-20
  • 2018-01-16
  • 1970-01-01
  • 2015-01-05
  • 2011-04-30
  • 1970-01-01
相关资源
最近更新 更多