1,from T_User
返回所有T_Usre以及TUser子类的记录,假如存在TUser的两个子类TSysAdmin和TSysOperator,那么记录中将包含两个子类的所有数据,即使不在一个表中.
2,为了避免在代码中出现SQL语句,可以采用配置文件的方式.在实体映射文件(hbm.xml)中,通过query节点定义查询语句(与class节点同级):
<class>
....
</class>
<query name="queryByName">
<![CDATA[from TUser user where user.name=:name]]>
</query>
代码中调用:
Query query = session.getNameQuery("queryByName");
Iterator it=query.iterate();
3,联合查询
inner join,left outer join,right outer join,full join(不常用)
from TUser user inner join fetch user.addresses
inner join 返回所有满足关联条件的记录组合."fetch"关键字表明TAddress对象读出后立即填充到对的TUser对象中.如果忽略掉,结果集中,每个条目都是一个Object数组,其中包括了一个TUser对象及其对应的TAddress对象.
from TUser user left join fetch user.addresses
left join返回的结果集中包含了T_User表(HQL中位于左侧的表)中的所有记录及其对应的地址信息(如无,则以NULL替代)
from TUser user right join user.addresses
与left join相反,返回位于右侧的所有记录及其对应的T_User记录.注意:fetch关键字只对inner join left join有效
4,子查询
from TUser user where (select count(*) from user.addresses)>1
5,数据加载方式
a,即时加载 b,延时加载 c,预先加载(out join) d,批量加载
6,SQL查询
sql: select * from T_User where name='Erica'
代码:
String sql = "select {user.*} from T_User user ";
List list=session.createSQLQuery(sql,"user",TUser.class).list;
对于SQL语句,也可以在配置文件中定义 <sql-query name="queryUser"></sql-query>
存储过程使用
有如下存储过程Oracle:
CREATE OR REPLACE FUNCTION getUsersByAge(userAge in NUMBER)
RETURN
SYS_REFCURSOR AS c_user SYS_REFCURSOR;
BEGIN
OPEN c_user FOR
SELECT ID,NAME FROM TUSER WHERE AGE= userAge;
RETURN c_user;
END;
配置文件中:
<sql-query name="getUsesrByAge" callable="true">
<return alias="user" class="cn.zt.entity.TUser">
<return-property name="id" column="ID">
<return-property name="name" column="NAME">
</return>
{ ? = call getUsersByAge(?)}
</sql-query>
说明:sql-query节点的callable属性设定为true,指明当前查询基于存储过程定义
测试程序:
Query query=session.getNamedQuery("getUsersByAge");
query.setInteger(0,18);
List list=query.list();