我在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中,提到的唯一区别是我应该使用第一种方法来删除和更新。两种方法之间的唯一区别是什么?告诉程序员它会返回结果吗?它会影响编译器吗?
答案 0 :(得分:1)
您的第一个查询返回对象[]列表而不是映射实体。 每个Object []包含数据库返回的一条记录。 然后,我们需要迭代数组,将每个Object转换为其特定类型,并将它们映射到我们的域模型。 这会产生大量重复的代码和类型转换
您的第二个查询需要返回实体的所有属性,而JPA实现(例如Hibernate)将尝试根据其名称和类型将返回的列映射到实体属性。如果成功,EntityManager将返回由当前持久性上下文管理的完全初始化的Author实体的列表。因此结果与我们使用JPQL查询的结果相同,但我们不仅限于JPQL的小功能集。
了解更多详情,请参阅