今天研究了一下Hibernate的级联查询。用MyEclipse的Hibernate模式生成pojo和xml文件挺方便的,但是级联查询会导致多次查询操作,有些影响效率呀!
一、数据库表结构
1、用户组表:
]create table SXF_GROUP
(
ID NUMBER(10) not null,
NAME VARCHAR2(32)
)
2、用户表
create table SXF_USERS
(
ID NUMBER(10) default 1 not null,
NAME VARCHAR2(20),
PASSWD VARCHAR2(15),
GROUPID NUMBER(10)
)
二、生成的配置文件(pojo略)
<class name="teststruts2.third.pojo.SxfGroup" table="SXF_GROUP" schema="SHENGTC">
<id name="id" type="java.lang.Long">
<column name="ID" precision="10" scale="0" />
<generator class="sequence" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" length="32" />
</property>
<set name="sxfUserses" inverse="true">
<key>
<column name="GROUPID" precision="10" scale="0" />
</key>
<one-to-many class="teststruts2.third.pojo.SxfUsers" />
</set>
</class>
<class name="teststruts2.third.pojo.SxfUsers" table="SXF_USERS" schema="SHENGTC">
<id name="id" type="java.lang.Long">
<column name="ID" precision="10" scale="0" />
<generator class="sequence" />
</id>
<many-to-one name="sxfGroup" class="teststruts2.third.pojo.SxfGroup" fetch="select">
<column name="GROUPID" precision="10" scale="0" />
</many-to-one>
<property name="name" type="java.lang.String">
<column name="NAME" length="20" unique="true" />
</property>
<property name="passwd" type="java.lang.String">
<column name="PASSWD" length="15" />
</property>
</class>
三、java查询代码
//action代码
List list = userServ.queryAllUsers();
for(Object obj : list){
SxfUsers user2 = (SxfUsers)obj;
System.out.println(user2.getSxfGroup().getName());
System.out.println(user2.getSxfGroup().getId());
}
//dao代码
Query query = this.getSession().createSQLQuery("select * from SXF_USERS").addEntity(SxfUsers.class);
list = query.list();
四、后台日志
Hibernate: select * from SXF_USERS
Hibernate: select sxfgroup0_.ID as ID1_0_, sxfgroup0_.NAME as NAME1_0_ from SHENGTC.SXF_GROUP sxfgroup0_ where sxfgroup0_.ID=?
测试
1
Hibernate: select sxfgroup0_.ID as ID1_0_, sxfgroup0_.NAME as NAME1_0_ from SHENGTC.SXF_GROUP sxfgroup0_ where sxfgroup0_.ID=?
开发
2
发现了没有,action里每调用一次getSxfGroup()方法,就执行一次数据库查询。如果直接写原生态sql语句一条sql就搞定了。
select t1.*,t2.name groupname
from sxf_users t1, sxf_group t2
where t1.groupid = t2.id
Hibernate的效率是不是有问题呢?