首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

容小弟我无知,问个关于hibernate的效率有关问题

2012-01-01 
容我无知,问个关于hibernate的效率问题我刚学hibernate,发现用load(class,id)或者get(class,id)方法就可以

容我无知,问个关于hibernate的效率问题
我刚学hibernate,发现用load(class,id)或者get(class,id)方法就可以方便地得到主键是id的对象,这个功能确实比自己拼sql语句,然后在用一大堆getInt什么的要好很多。但是现在有个问题,假设我的表里有100个字段,除id和title字段存储的内容长度很小外,其它98个字段都要占用1M的空间,我需要在一个页面里显示这个表中前30条记录的id和title作为目录和索引,当用户单击对应的title的时候才进入一个页面查看该title所对应的记录的一部分字段(假设是3个字段)。如果我用传统的sql来搞的话就用select id,title from table ……这样的方式来查询以减少不必要的信息对性能带来的影响。那在hibernate里不就要把这30条记录的100个字段全部给缓存到内存了?

[解决办法]
你这种需求,建议 手写hql
比如
select new XX(id,title) from XX
XX为你的对象类名,需要有(id,title)的构造函数,
这样,就可以了,而不再是,直接select xx from XX xx了
[解决办法]
你依然可以通过hibernate使用原生态SQL进行单独字段查询并可将结果封装成bean.只不过此时你的bean中只有你查询的字段,其余未被查询的值都将为空或者默认值。

针对你提出的可以如下编程:

Java code
Query query = session.createSQLQuery("select id,title from  table_name").setResultTransformer(Transformers.aliasToBean(Table_Bean.class));List<Table_Bean> list = query.list();for(Table_Bean tb:list){  assertNotNull(a.getId());  assertNotNull(a.getTitle());  assertNull(a.getName());  //...so many assert}
[解决办法]
探讨
你这种需求,建议 手写hql
比如
select new XX(id,title) from XX
XX为你的对象类名,需要有(id,title)的构造函数,
这样,就可以了,而不再是,直接select xx from XX xx了

[解决办法]
我也才学习到这里 和那个update更新时候的效率问题一样 用
Java code
Query q = (Query) session.createQuery("update Teacher t set t.name='xiaolanzhu' where t.id = 5 ");
[解决办法]
这个的情况你就没必要获得整个实体了,就根据你的需要写sql语句,得到你需要的部分就可以了。

热点排行