锁定老帖子 主题:如何在一个HQL中对子表使用查询条件?
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2004-01-08
没有关系阿, 跟你有几个子类的集合没什么关系的,用懒加载先取父对象, 然后用session的filter()对每个子对象集合作filter, 这样得到的集合还是没有从数据库中加载出来的, 只有\在你用的时候才会去数据库中去数据的.
|
|
返回顶楼 | |
发表时间:2004-01-08
可以直接对子类查询啊,因为child类中不是有个成员变量是father的对象吗?
select child.father where child.xxx=.... 如果父类中有子类的set,那么不可能完全做到,只得到父类对象,就算是lazyloading,父类为了得到子类的id也访问了一次数据库。 并不是每个有父子关系的地方,父类一定要有一个子类的set成员变量。 |
|
返回顶楼 | |
发表时间:2004-01-08
zsumore 写道 我更麻烦
我的Class里有两个Set 完全按照OO的想法,每个父类包含一个子类的set,如下 class father{ set children; .... } 当然无可非议,但是考虑到hibernate的实现,得到父类的对象同时也至少会得到子类的id。如果你的程序不是经常同时需要得到父子的话,我会去掉这个set。 |
|
返回顶楼 | |
发表时间:2004-01-08
jaqwolf 写道 zsumore 写道 我更麻烦
我的Class里有两个Set 完全按照OO的想法,每个父类包含一个子类的set,如下 class father{ set children; .... } 当然无可非议,但是考虑到hibernate的实现,得到父类的对象同时也至少会得到子类的id。如果你的程序不是经常同时需要得到父子的话,我会去掉这个set。 那不是一个Set里有,两个one-to-many? Set的name属性怎么办? |
|
返回顶楼 | |
发表时间:2004-01-09
我可能没有说清楚,我的意思是去掉父类中表示子类那个成员变量。
也就是不要set children了。 得到某个父类的子类,就对子类查询。因为子类中包含父类的标识嘛。 这样在某些经常需要得到父类集合而不需要访问子类的情况下,减少对数据库访问,也并不破坏OO模型。 |
|
返回顶楼 | |
发表时间:2004-01-09
jaqwolf 写道 我可能没有说清楚,我的意思是去掉父类中表示子类那个成员变量。
也就是不要set children了。 得到某个父类的子类,就对子类查询。因为子类中包含父类的标识嘛。 这样在某些经常需要得到父类集合而不需要访问子类的情况下,减少对数据库访问,也并不破坏OO模型。 这还叫“不破坏OO模型”? 其实保留set children也可以通过子类查询得到父类的集合,我看不出哪里会影响性能啊! |
|
返回顶楼 | |
发表时间:2004-01-09
当然有点点破坏啦,最为自然的想法当然是父类中包含一个子类set。
但是有一种情况会影响,我举个实例来说明: 比如一个thread包含很多post,但是进入forum页面这个经常执行的页面,只需要得到thread列表,如果thread包含一个set posts,那么在我得到thread的时候,hibernate也至少是得到了所有post的id(这是在lazy=true的情况下),本来得到thread列表,是一条sql语句,而现在使用了n+1条(假设一个页面显示n个thread)。当然是不必要的。 什么情况下,这多消耗是无所谓的呢?当我得到父的时候,往往不久就要用到子,这样的情况就无所谓。但是在我举的例子中,经常只需要得到thread而不需要post信息,但由于级连,hibernate还是为每一个thread执行了一次为得到子的查询。 所以,我有时候对于ORM还存在着一点犹豫,我之所以用它是因为希望有了它,我完全可以用OO来思考问题,但是实际上遇到具体问题的时候,确不是那么简单,必须迁就一些东西,我知道有所得当然也有所失,至于失去多少是要具体权衡得。 |
|
返回顶楼 | |
发表时间:2004-01-09
这样的话,thread设代理行不行?
|
|
返回顶楼 | |
发表时间:2004-01-09
引用 如果thread包含一个set posts,那么在我得到thread的时候,hibernate也至少是得到了所有post的id(这是在lazy=true的情况下),本来得到thread列表,是一条sql语句,而现在使用了n+1条(假设一个页面显示n个thread)。当然是不必要的。 不对,看看文档吧 引用 但由于级连,hibernate还是为每一个thread执行了一次为得到子的查询 级连?这和级连有什么关系? |
|
返回顶楼 | |
发表时间:2004-01-09
我重新看了一下文档,有一点不清楚:
假设Thread的lazy=true,Thread中的set posts也是lazy=true。 那么我列出threads的时候是不是这样一个过程: 1。首先hibernate取得所有threads的id。 2。直到threadd对象首次调用任何一个get方法的时候,才根据这个thread对象的id到数据库中查询,并且填充thread对象中除开posts之外所有的属性。 3。直到调用thread.getPosts()的时候,才访问数据库,填充post set中所有的对象。 。。。。 我现在的理解是不是正确?黑体字是我不清楚的地方。 |
|
返回顶楼 | |