使用<sql-query/>元素定义命名查询时,通常可以包含一个或多个的如下子元素:
<return/>:将查询结果转换成持久化实体。
<return-join/>:预加载持久化实体的关联实体。
<return-scalar>:将查询的数据列转换成标量值。
在使用命名SQL查询时,不需要调用addEntity()、addScalar()等方法,因为在配置命名SQL查询时,已经指定了查询返回的结果信息。
<sql-query name="queryTest">
<!--将s别名转换成lee.Student实体-->
<return alias="s" class="lee.Student"/>
<!--将e别名转换成lee.Enrolment实体-->
<return alias="e" class="lee.Enrolment"/>
<!--预初始化e的course属性(关联实体)-->
<return-join alias="c" class="e.course"/>
<!--指定将student表的name列作为标量返回-->
<return-scalar column="s.name" type="string"/>
select s.*,e.*,c.* from student s,enrolment e,course c
where s.student_id = e.student_id and e.course_code = c.course_code
and e.year =: targetYear
</sql-query>
使用Session的getNamedQuery即可获取指定命名SQL查询,代码片段如下:
List l = session.getNamedQuery("queryTest")
.setInteger("targetYear",2005)
.list();
除此之外,Hibernate允许把结果集的映射信息放在<resultset/>元素来定义,这样就可让多个命名查询公用结果集映射。通过<sql-query/>元素制定resultset-ref属性,就可让命名SQL查询使用一个已有的结果映射了。例如,定义一个独立的结果集映射:
<resultset name="studentGroup">
<return alias="s" class="lee.Student"/>
<return-scalar column="s.name" type="string"/>
</resultset>
下面的命名SQL查询就可使用上面的结果集映射信息了:
<sql-query name="test" resultset-ref="studentGroup">
select s.* from student s
</sql-query>