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

我想了解在Hibernate的循环中运行本机查询和命名查询之间的区别

马欣荣
2023-03-14

有人能帮我弄清楚在Hibernate中运行本机查询和循环运行命名查询之间的区别吗?我搜索了很多论坛,但没有得到一个清晰的视图。

我在代码中遇到的问题是,有两个查询,一个名为本机查询,一个名为查询。因此,当我在Hibernate中循环迭代查询时,在命名的本机查询中,我一次又一次地得到具有相同值的实体作为结果,但在命名查询的情况下,我得到了具有不同值的不同实体。为什么会发生这种情况?

我使用的数据库是SQL Server 2008,用orm.xml编写了查询。

假设这是我的服务类

@Autowired
@Qualifier("empDAO")
private EmpDAO empdao;

for(String empName : empNameList){

empEntity = empDao.getNativeResult(empName)

sysout(empEntity.getName())
sysout(empEntity.getAge())

empEntity = empDao.getNamedResult(empName)

sysout(empEntity.getName())
sysout(empEntity.getAge())

}

这是我的orm.xml

http://java.sun.com/xml/ns/persistence/orm_1_0.xsd”

<named-query name="getEmpNamedQuery">
    <query><![CDATA[
            select EMP      
                from 
    EmployeeEntity EMP           
              WHERE EMP.name LIKE CONCAT('%',CONCAT(:userId,'%'))

    ]]></query>
</named-query>


<named-native-query name="retrieveNativeretrieveEmployeeData"
    result-set-mapping="retrieveEmployeeDataMapping">
    <query><![CDATA[
            SELECT 
                ROW_NUMBER() OVER (ORDER BY EMP.EMP_ID) RowNumber,
                CURR.CURR_NAME as CurrencyCode,
                prd.PRD_TYPE_SUBTYPE_NAME as ProductName,
                    FROM
                    Employee_Table EMP
                    WHERE EMP.EMP_NAME LIKE ('%'+(:userId+'%'))
                    group by EMP.EMP_ID
     ]]></query>
</named-native-query>

<sql-result-set-mapping name="retrieveEmployeeDataMapping">
    <entity-result
        entity-class="myProject.persistance.entity.EmployeeNativeEntity">
        <field-result name="empName" column="EmployeeName" />
        <field-result name="rowNumber" column="RowNumber" />
        <field-result name="empAge" column="EmployeeAge" />
    </entity-result>
</sql-result-set-mapping>

我的DAO班

进口javax.persistence.Query;进口org.springframework.stereotype.Repository;

进口com.metlife.epooling.persistent.entity.ClientMstEntity;

@Repository("empDAO")公共类empDAO{

public EmployeeEntity getNamedResult(String name){
    Query query = entityManager.createNamedQuery("getEmpNamedQuery");
    query.setParameter("userId", name);
    return (EmployeeEntity)query.getSingleResult();

}

public EmployeeNativeEntity getNativeResult(String name){
        Query query = entityManager.createNamedQuery("getEmpNamedQuery");
        query.setParameter("userId", name);
        return (EmployeeNativeEntity)query.getSingleResult();

}

}

实体EmployeeEntity由三列组成:empId、empName、empAge

第二个实体 EmployeeNativeEntity 由三列 rownumber,empAge,empName 组成

共有1个答案

高博涉
2023-03-14

在 namedquery 中,您将获得记录列表,但在 namednativequery 中,您将获得按 id 分组的ROW_NUMBER() (多少条记录)。难怪结果会有所不同。

 类似资料:
  • 问题内容: 查询,本机查询,命名查询和类型查询之间有什么区别?“独立”查询是否存在,还是只是缩写?在我看来,本机查询是用简单sql编写的查询,而命名查询与实体(hibernate映射)有关。有人可以简要解释一下吗? 问题答案: 询问 查询是指JPQL / HQL查询,其语法类似于通常用于执行DML语句(CRUD操作)的SQL。 在JPA中,您可以使用创建查询。您可以查看API以获得更多详细信息。

  • 我想在我的repo中写一个本机查询“Select*in from table”。表名与实体名不同。 运行查询时, 1如果我把实体名称返回表未找到。 2如果我将表名放在查询中,则查询的验证失败。 问题是 如果我使用"Select*from TariffPacks r2..., nativeQuery=true",我得到错误TariffPacks不存在。如果我使用"Select*from RECHAR

  • 我有一个简单的查询循环,它在大约93分钟内处理了96,945个文档中的44,000个文档后获得一个MongoCursorNotFoundException。 “做一些事情”部分需要一段时间,这就是为什么整个循环需要这么长时间的原因。 我的问题是,在处理集合中可能一半的文档后,我会得到这个异常。 我正在Windows10笔记本电脑上本地运行客户端应用程序和mongod服务器,通过localhost访

  • 我有一个名为ArtWork的实体,该实体具有属性列表 样式具有称为标题的属性 我需要一个Hibernate查询,返回所有具有style title=“Abstract”的艺术品 -谢谢你的帮助

  • 问题内容: 在我的Hibernate JPA示例代码中。 给整个字符串时它工作正常 但是,当我们赋予ie 或 其实我的想法是我给运算符,使它可以工作给定字符串的任何字符。 问题答案: 您正在使用 代替 第一个将返回 等的行。

  • 问题内容: 我对Hibernate Native Query有问题。我有一个选择,它选择数组切片(PostgreSQL数据库)。 问题在于hibernate状态识别以下部分:来自“ SELECT my_array [1:300] …”的“:300”作为命名参数,并且我得到以下异常:尚未设置所有命名参数。 我试图用’:’,’::’逃脱冒号(:),但没有成功。 Hibernate版本是3.2 问题答案