日期:2014-05-17  浏览次数:20691 次

hibernate查询时的问题(高分)
hibernate关联查询时,会把所有的关联对象查出来,这样数据量一旦增加,查询效率会大大降低,有什么办法可以解决吗
------解决方案--------------------
懒加载。。。不过大数据量的查询还是别用hibernate。。。到时你就知道有多蛋疼了。。。
------解决方案--------------------
设置fetch = FetchType.LAZY
如果是LAZY,那么取出这条数据时,它关联的数据并不取出来,在同一个session中,什么时候要用,就什么时候取(再次访问数据库)
------解决方案--------------------
没什么好办法,既然是关联查询,无论是否lazy是什么值,都必须联表查询,不过你可以设置一些冗余字段。查询一个表比多个表效率高很多。还有就是使用select子句只查询有用的字段,不需要显示的不要查询,。
------解决方案--------------------
引用:
Quote: 引用:

设置fetch = FetchType.LAZY
如果是LAZY,那么取出这条数据时,它关联的数据并不取出来,在同一个session中,什么时候要用,就什么时候取(再次访问数据库)


只在enity里设置fetch = FetchType.LAZY就行嘛?还有别的需要改动吗

没有,加上注解就可以了
------解决方案--------------------
引用:
Quote: 引用:

没什么好办法,既然是关联查询,无论是否lazy是什么值,都必须联表查询,不过你可以设置一些冗余字段。查询一个表比多个表效率高很多。还有就是使用select子句只查询有用的字段,不需要显示的不要查询,。

请问你所说的冗余字段是指在同一个表中再建立一个所关联表中的字段吗?

是的,这种策略是给大数据量系统设计时才使用的,比如起码是千万以上的数据量,数据库主机不够牛就需要采用这种策略。我看你本帖其他回复,好像你多lazy也不太了解。你最好先确定是否需要冗余字段:比如,你数据量到底多大?关联查询一般需要几个表关联。2表以上都需要做笛卡尔乘积的效率衰减。2表为单表效率80%,3表为20%
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

设置fetch = FetchType.LAZY
如果是LAZY,那么取出这条数据时,它关联的数据并不取出来,在同一个session中,什么时候要用,就什么时候取(再次访问数据库)


只在enity里设置fetch = FetchType.LAZY就行嘛?还有别的需要改动吗

没有,加上注解就可以了


额...这样好象也还是不行啊..以前用过的

懒加载为什么会失败啊?
------解决方案--------------------
延迟加载 ,用的时候才会加载。
------解决方案--------------------
   按你的  需求hibernate有这种机制也就是上面说的 -----懒加载---注解的话 设置一下  fetchType=lazy即可
------解决方案--------------------
分页查询或者sql
------解决方案--------------------
lazy=true
------解决方案--------------------
如果数据量大,一定要分页的。
------解决方案--------------------
配置时设为懒加载,查找时,使用select 的HQL拼接可解
------解决方案--------------------
那些说数据量大的不用hibernate的就是瞎扯淡.
不用hibernate用jdbc?hibernate底层就是jdbc,慢只会慢在hql->sql的时间.而且执行一次后,下次就不用编译了
@ManyToOne的都是立即加载,建议加LAZY.
1.多数情况都有分页.
2.一对多,查询多的时候,建议分2次查询.
3.常用数据加缓存