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

2022-09-01 07:15:27

我有一个扩展的对象。默认情况下,两个对象都位于我的 Derby 数据库的表中(包含的字段来自 )。通常我会选择一个这样的:AdminUserUser_AdminUser

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

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


答案 1

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

  • 使用方法createNativeQuery(sqlString, resultClass)

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

    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

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

    @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() 的使用,请参阅为什么你不应该在 JPA 中使用 getSingleResult()。


答案 2

接受的答案不正确。

createNativeQuery将始终返回 :Query

public Query createNativeQuery(String sqlString, Class resultClass);

要求退货 :getResultListQueryList

List getResultList()

将 (或强制转换) 给 时,将生成未选中的分配警告。List<MyEntity>

鉴于, 将返回 :createQueryTypedQuery

public <T> TypedQuery<T> createQuery(String qlString, Class<T> resultClass);

调用返回 。getResultListTypedQueryList<X>

List<X> getResultList();

这是正确键入的,不会发出警告。

使用 ,使用似乎是摆脱警告的唯一方法。就个人而言,我选择抑制警告,因为我认为这是图书馆的缺陷,而不是我应该担心的事情。createNativeQueryObjectMapper


推荐