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

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

乜烨霖
2023-03-14

我有一个对象admin,它扩展了user。默认情况下,这两个对象都在我的Derby数据库的表user_中(包含admin中的字段)。通常我会选择用户,如下所示:

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查询返回的@lob@ManyToOne(等等)相同的值)来选择用户

共有1个答案

娄建义
2023-03-14

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

>

  • 使用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注释或 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()的使用,请参阅为什么在JPA中从不使用GetSingleResult()

  •  类似资料:
    • 问题内容: 我有一个延伸的对象。默认情况下,两个对象都在我的Derby数据库的表中(来自的包含字段)。通常我会选择一个这样的: 但是由于查询的复杂性,我使用的是本机查询,如下所示: 尽管这会引发强制转换异常。我认为这是由于中的任何字段造成的。 我的问题是,我如何选择一个使用本机查询的结果与第一个示例相同的结果(包括与JPQL查询将返回的和(等)相同的值)? 问题答案: 您可能想尝试以下方法之一:

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

    • 问题内容: 我正在使用JPQL本机查询来联接表,查询结果存储在中。 问题是 输出: 输出: 所以我假设我可以分配out.get(0)的返回值,该值应该是String: 但是我得到了奇怪的ClassCastException。 那么到底是怎么回事?甚至会抛出ClassCastException :( 问题答案: 我对JPQL本机查询不熟悉,但是您只需使用以下命令进行调试: 对象o = out.get

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

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

    • 奇怪的情况-下面是代码: 构建项目时(在项目属性中使用编译器选项Xlint:unchecked),我得到一个警告: 警告:[未选中]未选中的强制转换 ArrayList list=(ArrayList)obj[1]; 必需:ArrayList 找到:对象 但用同样的方法来浇铸字符串是可以的。这里有什么问题?