java将实体类参数传递给createNativeQuery做什么?
我在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 楼答案
第一个查询返回对象[]的列表,而不是映射的实体。 每个对象[]包含数据库返回的一条记录。 然后我们需要遍历数组,将每个对象转换为其特定类型,并将它们映射到我们的域模型。 这会产生大量重复的代码和类型转换
第二个查询需要返回实体的所有属性,JPA实现(例如Hibernate)将尝试根据返回的列的名称和类型将其映射到实体属性。如果成功,EntityManager将返回由当前持久性上下文管理的完全初始化的作者实体列表。因此,结果与我们使用JPQL查询的结果相同,但我们不限于JPQL的小功能集
有关更多详细信息,请参阅
http://www.thoughts-on-java.org/result-set-mapping-basics/