0

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

我在代码中遇到的问题是,有两个查询,一个名为 native,一个名为 query。因此,当我在休眠状态的循环中迭代查询时,在命名本机查询的情况下,我一次又一次地得到具有相同值的实体,但在命名查询的情况下,我得到具有不同值的不同实体。为什么会这样?

我使用的数据库是 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

4

1 回答 1

0

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

于 2013-07-19T03:46:18.943 回答