当前位置: 首页 > 面试题库 >

JPA本机查询选择和转换对象

汪胡非
2023-03-14
问题内容

我有一个Admin延伸的对象User。默认情况下,两个对象都在User_我的Derby数据库的表中(来自的包含字段Admin)。通常我会选择一个User这样的:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<User> query = cb.createQuery(User.class);
Root user= query.from(User.class);
Predicate predicateId = cb.equal(category.get("id"), id);
query.select(user).where(predicateId);
return em.createQuery(query).getSingleResult();

但是由于查询的复杂性,我使用的是本机查询,如下所示:

Query query = em.createNativeQuery("SELECT USER.* FROM USER_ AS USER WHERE ID = ?");
query.setParameter(1, id);
return (User) query.getSingleResult();

尽管这会引发强制转换异常。我认为这是由于中的任何字段造成的Admin

我的问题是,我如何选择一个User使用本机查询的结果与第一个示例相同的结果(包括与JPQL查询将返回的@LOB@ManyToOne(等)相同的值)?


问题答案:

您可能想尝试以下方法之一:

  • 使用 方法createNativeQuery(sqlString, resultClass)

还可以使用EntityManager.createNativeQuery()API 动态定义本机查询。

    String sql = "SELECT USER.* FROM USER_ AS USER WHERE ID = ?";

Query query = em.createNativeQuery(sql, User.class);
query.setParameter(1, id);
User user = (User) query.getSingleResult();
  • 使用 注释@NamedNativeQuery

本机查询是通过@NamedNativeQuery@NamedNativeQueries 注释或<named-native- query>XML元素定义的。

    @NamedNativeQuery(
    name="complexQuery",
    query="SELECT USER.* FROM USER_ AS USER WHERE ID = ?",
    resultClass=User.class
)
public class User { ... }

Query query = em.createNamedQuery("complexQuery", User.class);
query.setParameter(1, id);
User user = (User) query.getSingleResult();

您可以在精美的开放书《 Java
Persistence》

PDF格式

)中阅读更多内容。

────────
:关于的使用 getSingleResult()
,请参见为什么永远不要getSingleResult()在JPA中使用。



 类似资料:
  • 我有一个对象,它扩展了。默认情况下,这两个对象都在我的Derby数据库的表中(包含中的字段)。通常我会选择,如下所示: 但是,由于查询的复杂性,我使用的是本机查询,如下所示: 但这会引发一个强制转换异常。我认为这是由于中的任何字段。 我的问题是,如何使用具有相等结果的本机查询作为第一个示例(包括与JPQL查询返回的和(等等)相同的值)来选择?

  • 当使用jpa本机查询 事务传播是我们正在使用的正确jpa的唯一特性吗? 在我的意见中,我就像使用普通的旧jdbc pluc jpa事务传播 我正在阅读PRO JPA一书,根据我的理解 当我们使用JPA本机查询获取一组标量值时(与我们使用jdbc的方式很相似),实际上没有托管实体和持久性上下文的概念。当我们通过本机查询检索实体时,情况会发生变化。

  • 问题内容: JPA()中的本机查询是否支持缓存? 我正在填写自己的数据传输对象,因为sql查询会联接多个表,并且仅从表中获取几个列。 问候 问题答案: 这是可能的,但 您必须使用显式或。 也可以看看 缓存SQL查询问题 hibernate:真正了解二级和查询缓存

  • 我有一个用hibernate持久化的带有DateTime属性的实体 对于常规的spring-data-jpa生成的查询来说,这一切都很好。 我正在尝试添加自定义本机查询 我得到的错误是当试图调用这个是 这与我在将自定义类型映射添加到实体之前使用常规spring-data Finder时得到的错误相同 如何使spring-data-jpa/hibernate使用参数到本机查询的自定义类型映射?

  • 我试图将下面的PostgreSQL查询转换为本机查询,但遇到错误。 Postgres查询: 本机查询: 但我得到了以下错误: 无法提取结果集;SQL [n/a];嵌套异常是 org.hibernate.exception.SQLGrammarException: 无法提取 ResultSet

  • 问题内容: 我认为这应该很容易,但是却在逃避我。我在帐户和帐户组之间建立了多对多关系。一个帐户可以在零个或多个组中,因此我使用的是标准联接表。 我正在使用MS Access,FWIW。另外,这是针对低带宽的情况,因此代码优化不如简单性/可读性那么重要。 我使用php作为表示层,因此Access的基本结果很好。 至于如何处理多结果情况,我实际上有两件事正在尝试构建。第一列在一个列中列出了所有组,因此