将实体类参数传递给createNativeQuery有什么作用?

时间:2017-05-21 16:31:04

标签: java hibernate jpa

我在Hibernate中使用了一个简单的查找方法:

@Override
public TblUser findByUsername(String username) {
    return (TblUser) entityManager.createNativeQuery("SELECT * FROM tblUser WHERE username = ?", TblUser.class)
            .setParameter(1, username)
            .getSingleResult();
}

将实体类参数传递给createNativeQuery方法有什么作用?我可以传递或不传递,无论我使用java从查询中转换结果。那么前面的代码片段和这个代码片段之间的区别是什么:

@Override
public TblUser findByUsername(String username) {
    return (TblUser) entityManager.createNativeQuery("SELECT * FROM tblUser WHERE username = ?")
            .setParameter(1, username)
            .getSingleResult();
}

documentation中,提到的唯一区别是我应该使用第一种方法来删除和更新。两种方法之间的唯一区别是什么?告诉程序员它会返回结果吗?它会影响编译器吗?

1 个答案:

答案 0 :(得分:1)

您的第一个查询返回对象[]列表而不是映射实体。  每个Object []包含数据库返回的一条记录。  然后,我们需要迭代数组,将每个Object转换为其特定类型,并将它们映射到我们的域模型。  这会产生大量重复的代码和类型转换

您的第二个查询需要返回实体的所有属性,而JPA实现(例如Hibernate)将尝试根据其名称和类型将返回的列映射到实体属性。如果成功,EntityManager将返回由当前持久性上下文管理的完全初始化的Author实体的列表。因此结果与我们使用JPQL查询的结果相同,但我们不仅限于JPQL的小功能集。

了解更多详情,请参阅

http://www.thoughts-on-java.org/result-set-mapping-basics/