日期:2014-05-20  浏览次数:20661 次

容我无知,问个关于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语句,得到你需要的部分就可以了。