我刚学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个字段全部给缓存到内存了?

解决方案 »

  1.   

    你这种需求,建议 手写hql
    比如
    select new XX(id,title) from XX
    XX为你的对象类名,需要有(id,title)的构造函数,
    这样,就可以了,而不再是,直接select xx from XX xx了
      

  2.   

    你依然可以通过hibernate使用原生态SQL进行单独字段查询并可将结果封装成bean.只不过此时你的bean中只有你查询的字段,其余未被查询的值都将为空或者默认值。针对你提出的可以如下编程:
    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
    }
    这样你那其余的98个大字段就不会被查询缓存了!
      

  3.   


    哦忘了说 我测试用的hibernate版本是3.6.1的。 在使用setResultTransformer前你需要查看下你使用的hibernate版本是否支持这种方式。
      

  4.   

    +1
    对,这样返回的是对象,但是需要建立构造函数。
    如果是select id,title from  table_name 返回的是数组而不是对象,
      

  5.   

    原来还可以这样用,那么还不如把hibernate和jdbc结合起来用,这样在执行我的需求的时候效率还要高些。
      

  6.   

    我也才学习到这里  和那个update更新时候的效率问题一样  用 Query q = (Query) session.createQuery("update Teacher t set t.name='xiaolanzhu' where t.id = 5 ");更新的时候只更新指定的字段
      

  7.   

    这个的情况你就没必要获得整个实体了,就根据你的需要写sql语句,得到你需要的部分就可以了。