无论是延迟加载还是立即加载,主对象的每个关联属性都会执行一条sql去取数据。
如果要查询显示的数据主表的数据行非常多,还是无法避免频繁的执行sql.
一个对象n个关联属性,有m行数据,就会有1+n*m条sql.
所以在列表显示的中不合适使用该方式,可以考虑采用联合查询,一条sql就完成。
采用联合查询的依据:
取同样的数据,执行的sql越多越耗资源。
提取数据,列数越少越好,所以只提取要显示的列
适用场合:
在列表显示中,显示的行数比较多,如果关联属性比较多最好用关联查询。否则执行过多的sql势必影响性能。
同时指定提取要用的列,可以提高性能。
提取部分列带来的问题:
返回的每个对象的属性就是数组了,使用会不方便。
但是可以转变为对象,也就是动态构造对象。
如:selectnew CclBdNetdata(q.id,q.code,q.name)
FROMCclBdNetdataASq ORDER BY q.code asc
同时要设计对应的构造函数
publicCclMsgHttprequest(String id ,String msgres)
如果不转变为对象的方式如下
String hql="select stu.fname,sc.fid ,c.fname "
+" fromStudentstu ,Studentcoursesc ,Coursec"
+" where stu.fid=sc.student and sc.course=c.fid";
List ls=stuDao.getQueryData(hql,null,0, 0);
for(inti=0,j=ls.size();i<j;i++){
Object[]ress=(Object[])ls.get(i);
System.out.print(ress[0]);
System.out.print(ress[1]);
System.out.print(ress[2]);
System.out.println("");
}
l 内连接
交叉查询的方式
跟sql非常相识
String hql = " select d.name,q.name "
+"FROM CclMsgHttprequest q,CclBdNetdata d "
+" where d.id=q.cclBdNetdata" ;
产生的sql:
select cclbdnetda1_.NAME as col_0_0_, cclmsghttp0_.NAME as col_1_0_ from CCL_MSG_HTTPREQUEST cclmsghttp0_, CCL_BD_NETDATA cclbdnetda1_ where cclbdnetda1_.ID=cclmsghttp0_.NETDATA
指定列的方式方式
会采用自动关联,这种关联会自动根据配置文件来
String hql =" select q.name ,q.cclBdNetdata.name"
+" FROM CclMsgHttprequest q "
+" ";
产生的sql:跟上面一样
select cclmsghttp0_.NAME as col_0_0_, cclbdnetda1_.NAME as col_1_0_
from CCL_MSG_HTTPREQUEST cclmsghttp0_, CCL_BD_NETDATA cclbdnetda1_
where cclmsghttp0_.NETDATA=cclbdnetda1_.ID
fetch的指定列的方式方式
hql:
FROM CclMsgHttprequest q inner joinfetchq.cclBdNetdata
产生的sql:
select cclmsghttp0_.ID as ID3_0_,
cclbdnetda1_.ID as ID1_1_, cclmsghttp0_.NETDATA as NETDATA3_0_,
cclmsghttp0_.PROTOCOLTYPE as PROTOCOL3_3_0_, cclmsghttp0_.CODE as CODE3_0_,
cclmsghttp0_.NAME as NAME3_0_, cclmsghttp0_.MSGVERSION as MSGVERSION3_0_,
cclmsghttp0_.ISTEMP as ISTEMP3_0_, cclmsghttp0_.MSGTYPE as MSGTYPE3_0_,
cclmsghttp0_.MSGCOUNT as MSGCOUNT3_0_, cclmsghttp0_.METHOD as METHOD3_0_,
cclmsghttp0_.MSGCONTTYPE as MSGCONT11_3_0_, cclmsghttp0_.STATE as STATE3_0_,
cclmsghttp0_.MSGDESCRIPTION as MSGDESC13_3_0_, cclmsghttp0_.REQURL as REQURL3_0_,
cclmsghttp0_.COOKIE as COOKIE3_0_, cclmsghttp0_.MSGCONT as MSGCONT3_0_,
cclmsghttp0_.MSGRES as MSGRES3_0_, cclbdnetda1_.CODE as CODE1_1_, cclbdnetda1_.NAME as NAME1_1_,
cclbdnetda1_.DESCRIPTION as DESCRIPT4_1_1_
fromCCL_MSG_HTTPREQUEST cclmsghttp0_, CCL_BD_NETDATA cclbdnetda1_
wherecclmsghttp0_.NETDATA=cclbdnetda1_.ID