锁定老帖子 主题:如何在一个HQL中对子表使用查询条件?
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2004-01-09
好像thread的id也没有取
|
|
返回顶楼 | |
发表时间:2004-01-09
zsumore 写道 好像thread的id也没有取
什么意思?? 。。。刚刚看了一篇robbin以前的帖子,。。。 http://forum.hibernate.org.cn/viewtopic.php?t=269 引用 第一步,去数据库中取主键列表,第二步,按照主键一个一个取数据。当然了,我们现在可以看出来,Iterator方式下如果不用JCS的话,那么从数据库中取出n条记录就需要n+1次sql查询,这是非常可怕的事情,因此如果在没有使用JCS的情况下,你又必须一次去取大量数据,应该避免使用Iterator。
而Iterator的第一次sql是取主键列表,这个时间消耗是非常少的,如果使用了JCS,那么每次查询仍然要不可避免的去发送一次sql: select id from cat 去取主键列表,然后呢? 然后Iterator就不会那么傻了,他会先到JCS里面去看看,按照主键去找持久对象,如果有了,直接拿出来用,如果没有,那么只好去数据库中取得,然后再把它填到JCS里面去。 因此可以看出来,JCS有点类似一个内存中的简单对象数据库, Iterator的第一次sql取主键列表是必须要到数据库里面取的,取得了主键这把钥匙以后,Iterator会首先尝试开JCS这把锁,打得开就直接进去,如果打不开,就只好去开数据库这把锁了。 而Hibernate List方式是JDBC的简单封装,一次sql就把所有的数据都取出来了,它不会像Iterator那样先取主键,然后再取数据,因此List无法利用JCS。不过List也可以把从数据库中取出的数据填充到JCS里面去。 我糊涂了 ,到底是否lazy是配置文件决定的还是由调用方法决定的?是不是literator必然就lazy了?而当我用list取得的时候哪怕是配置文件中设定了lazy=true,也是枉然?? |
|
返回顶楼 | |
发表时间:2004-01-09
你应该看看文档中这些的含义是什么
<class lazy="true"... <set lazy="true"...(or list,bag...) Session.find()和Query.list() Session.iterator()和Query.iterator() |
|
返回顶楼 | |
发表时间:2004-01-10
引用 比如一个thread包含很多post,但是进入forum页面这个经常执行的页面,只需要得到thread列表,如果thread包含一个set posts,那么在我得到thread的时候,hibernate也至少是得到了所有post的id(这是在lazy=true的情况下),本来得到thread列表,是一条sql语句,而现在使用了n+1条(假设一个页面显示n个thread)。当然是不必要的。
这段话错了,我收回并道歉 我写了测试代码跟踪了一下,实际上是当thread.getPost().iterator();才访问数据库。 |
|
返回顶楼 | |
发表时间:2004-01-10
引用 我糊涂了 ,到底是否lazy是配置文件决定的还是由调用方法决定的?是不是literator必然就lazy了?而当我用list取得的时候哪怕是配置文件中设定了lazy=true,也是枉然??
实际上,我把lazy init都简单的理解成为先获得id,直到get调用的时候才hit db来重新获得一次数据。这样理解当然是错的。 但是对于connection的lazy实现能讲一讲吗?class的lazy是通过cglib来实现的,能描述一下大致过程吗?我看了看源码。。看不懂 |
|
返回顶楼 | |