`
solid210
  • 浏览: 51927 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Hibernate只取出需要用到的字段(列)

 
阅读更多

今天下班后,回家的路上,在思考网站的优化问题。

这个问题几年以来一直存在,但是都没找到解决方法,曾经也许找过,但是未果。

 

存在问题:首页、列表等页面,取出的list,存在大量的冗余数据。

我用代码举例说明一下,例如列表页取出某个产品的list,HQL代码如下:

String hql = "from Product p where p.valid=:valid order by.......";

 这段代码返回的list<Product>中,list的每一条,都会保存Product对象的所有的内容。

 

 然而,列表页真正需要用到的,只有name(产品名称),id(数据的id),image(图片路径),publishTime(发布时间)……等等很少量的数据。像一些诸如产品规格、详细描述字段存储的内容,其实是用不到的。

 但是用不到,却取出来了,并且保存在返回的list里,于是就会增加不必要的内存开销,增加服务器的压力。

 

那么有什么办法能让list<Product>中的每一条数据,仅仅取出需要用到的呢?答案当然是有的,今天百度了一下,找到如下的解决方案:

写道
SELECT new xxx.xxx.xxx.xx.User(t.id, t.username) FROM User t;
然后在User 使用查询列id,username做一个构造函数,不过仅限于hibernate3以上版本

 

 举一反三,解决方案有了,呵呵。

 

String hql = "select new Product(p.id, p.name, p.image) from Product p where p.valid=:valid order by.......";

 

这样查询出来的是Product对象,而不是Object[]对象,结果比较满意。

 

 解决方法是在回家后找到的,因此还没应用到项目中,明天上班测试一下,会把结果发上来。

 

 PS:如果真的可行,那服务器得多么的感谢我呀,哈......

===========================昨日(2012年3月30日)的分割线=======================

 

今天到公司就开始改代码,把HQL语句改成上面类似的,之后运行测试,结果报错......异常信息如下

 

org.hibernate.hql.ast.QuerySyntaxException: Unable to locate appropriate constructor on class..... 

 

 去网上搜了一下,原来还得添加构造方法……构造方法如下:

 

 

public Product(){
/*这是空的构造方法,你不填写别的构造方法,这个可以不写,但是一旦有了别的
 *  构造方法,这个就必须得跟上了......
 */
}

public Product(Long id, String name, String image){
    this.id = id;
    this.name = name;
    this.image = image;
}

  这里有一个地方要注意一下:HQL里new Product之后的参数顺序,一定要和构造方法里的参数顺序保持一致!

  添加好构造方法,编译、运行测试,结果通过了,ok搞定!

 

  补充一句,如下的代码写法也是可以的,只要对象正确就ok:

String hql = "select new Product(id, name, image) from Product p where p.valid=:valid order by.......";

 

  至此,本文基本就结束了。小小的解决了hibernate不如ibatis的一大缺点,呵呵。

 

 

  以上做法能为服务器节省很大的内存,不过编码实在是麻烦,有没有更好的,比较智能的方式呢?继续寻找ing.....哪位大侠有好的方法,千万别吝啬,分享一下,大家都进步,社会才进步么,呵呵。希望不吝赐教!

 

分享到:
评论

相关推荐

    ssh(structs,spring,hibernate)框架中的上传下载

     所以我们的DAO只需要简单地调用父类的HibernateTemplate就可以完成几乎所有的数据库操作了。  由于Spring通过代理Hibernate完成数据层的操作,所以原Hibernate的配置文件hibernate.cfg.xml的信息也转移到Spring的...

    Java面试宝典2010版

    16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决; 17.介绍一下Hibernate的二级缓存 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message 属性, ...

    最新Java面试宝典pdf版

    16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决; 123 17.介绍一下Hibernate的二级缓存 123 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message ...

    Java面试笔试资料大全

    16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决; 123 17.介绍一下Hibernate的二级缓存 123 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message ...

    JAVA面试宝典2010

    16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决; 123 17.介绍一下Hibernate的二级缓存 123 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message ...

    Java面试宝典-经典

    16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决; 123 17.介绍一下Hibernate的二级缓存 123 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message ...

    java面试题大全(2012版)

    16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决; 123 17.介绍一下Hibernate的二级缓存 123 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message ...

    Java面试宝典2012版

    16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决; 123 17.介绍一下Hibernate的二级缓存 123 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message...

    java面试宝典2012

    16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决; 135 17.介绍一下Hibernate的二级缓存 135 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message ...

    Java面试宝典2012新版

    16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决; 123 17.介绍一下Hibernate的二级缓存 123 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message ...

    千方百计笔试题大全

    94、元素有一个cascade属性,如果希望Hibernate级联保存集合中的对象,casecade属性应该取什么值?(单选)(D) 22 95、以下哪些属于Session的方法?(A,B,C,D,F) 22 96、Hibernate工作原理及为什么要用? 22 97、...

    java面试宝典

    94、元素有一个cascade属性,如果希望Hibernate级联保存集合中的对象,casecade属性应该取什么值?(单选)(D) 22 95、以下哪些属于Session的方法?(A,B,C,D,F) 22 96、Hibernate工作原理及为什么要用? 22 97、...

    Java 面试宝典

    一. Java 基础部分..................................................................................................................... 7 1、一个".java"源文件中是否可以包括多个类(不是内部类)?...

Global site tag (gtag.js) - Google Analytics