Hibernate如何避免选取所有字段(select *)

雪域幽狐 2010-03-29 14:16 阅读:4149


在使用SQL查询数据库时,我们都知道要尽量避免select *,只查自己需要的字段,但是在使用Hibernate时,这个问题似乎绕不开了,执行select entity from TSysDepartment entity,那TSysDepartment entity这个对象所有字段都得选取出来,如果是一个小表还好说,如果在这个表有大字段时,这样做会较低性能,且select *这种事就不应该出现。

解决方法1,使用Object[],不推荐
HQL语句改为select entity.NId,entity.NPid,entity.NCorpId,entity.CName from TSysDepartment entity,仅选取了需要的字段,但是结果是一个Object[],每个Object里面又是一个Object[],还需要自己再转化为对象,很麻烦,且这样失去了ORM的作用了

解决方法2,使用一个实际的Java对象,即new 对象类(参数)方式,推荐
现在我们要选择的是TSysDepartment的4个字段,在TSysDepartment类里写一个对应的构造方法,比如
public TSysDepartment(Long NId, Long NPid, Integer NCorpId, String CName)
{几个设置成员变量略}
然后HQL可以这么写select new TSysDepartment(entity.NId,entity.NPid,entity.NCorpId,entity.CName) from TSysDepartment entity
这样getHibernateTemplate().find(HQL)返回一个List,每个Item是一个TSysDepartment,只有这4个参数有值

验证:
使用P6spy跟踪,在执行select new TSysDepartment(entity.NId,entity.NPid,entity.NCorpId,entity.CName) from TSysDepartment entity时,结果
select tsysdepart0_.N_ID as col_0_0_, tsysdepart0_.N_PID as col_1_0_, tsysdepart0_.N_CorpID as col_2_0_, tsysdepart0_.C_Name as col_3_0_ from DB_JY.dbo.T_SYS_Department tsysdepart0_
只选取了4个字段

直接使用select entity from TSysDepartment entity,结果
select tsysdepart0_.N_ID as N1_9_, tsysdepart0_.N_PID as N2_9_, tsysdepart0_.N_CorpID as N3_9_, tsysdepart0_.C_Name as C4_9_, tsysdepart0_.N_Type as N5_9_, tsysdepart0_.N_Jug as N6_9_, tsysdepart0_.N_Valid as N7_9_, tsysdepart0_.N_Order as N8_9_ from DB_JY.dbo.T_SYS_Department tsysdepart0_

0条评论

登陆后可评论