任何人都可以帮助我理解在Hibernate循环中运行本机查询和命名查询之间的区别。我搜索了许多论坛,但没有得到明确的观点。
我在代码中遇到的问题是,有两个查询,一个名为native,一个名为query。因此,当我在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课程
import javax.persistence.Query; import org.springframework.stereotype.Repository;
import 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
答案 0 :(得分:0)
在namedquery中,您获得了记录列表,但在namednativequery中,您获得ROW_NUMBER()
(按id分组的记录数)。难怪会有不同的结果。