日期:2014-05-16  浏览次数:20620 次

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.....哪位大侠有好的方法,千万别吝啬,分享一下,大家都进步,社会才进步么,呵呵。希望不吝赐教!

?