有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

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

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

    有关更多详细信息,请参阅

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