论坛首页 Java企业应用论坛

如何在一个HQL中对子表使用查询条件?

浏览 13168 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2004-01-08  
没有关系阿, 跟你有几个子类的集合没什么关系的,用懒加载先取父对象, 然后用session的filter()对每个子对象集合作filter, 这样得到的集合还是没有从数据库中加载出来的, 只有\在你用的时候才会去数据库中去数据的.
0 请登录后投票
   发表时间:2004-01-08  
可以直接对子类查询啊,因为child类中不是有个成员变量是father的对象吗?
select child.father where child.xxx=....

如果父类中有子类的set,那么不可能完全做到,只得到父类对象,就算是lazyloading,父类为了得到子类的id也访问了一次数据库。

并不是每个有父子关系的地方,父类一定要有一个子类的set成员变量。
0 请登录后投票
   发表时间:2004-01-08  
zsumore 写道
我更麻烦
我的Class里有两个Set


完全按照OO的想法,每个父类包含一个子类的set,如下
class father{
set children;
....
}
当然无可非议,但是考虑到hibernate的实现,得到父类的对象同时也至少会得到子类的id。如果你的程序不是经常同时需要得到父子的话,我会去掉这个set。
0 请登录后投票
   发表时间:2004-01-08  
jaqwolf 写道
zsumore 写道
我更麻烦
我的Class里有两个Set


完全按照OO的想法,每个父类包含一个子类的set,如下
class father{
set children;
....
}
当然无可非议,但是考虑到hibernate的实现,得到父类的对象同时也至少会得到子类的id。如果你的程序不是经常同时需要得到父子的话,我会去掉这个set。

那不是一个Set里有,两个one-to-many?
Set的name属性怎么办?
0 请登录后投票
   发表时间:2004-01-09  
我可能没有说清楚,我的意思是去掉父类中表示子类那个成员变量。
也就是不要set children了。
得到某个父类的子类,就对子类查询。因为子类中包含父类的标识嘛。

这样在某些经常需要得到父类集合而不需要访问子类的情况下,减少对数据库访问,也并不破坏OO模型。
0 请登录后投票
   发表时间:2004-01-09  
jaqwolf 写道
我可能没有说清楚,我的意思是去掉父类中表示子类那个成员变量。
也就是不要set children了。
得到某个父类的子类,就对子类查询。因为子类中包含父类的标识嘛。

这样在某些经常需要得到父类集合而不需要访问子类的情况下,减少对数据库访问,也并不破坏OO模型。


这还叫“不破坏OO模型”?
其实保留set children也可以通过子类查询得到父类的集合,我看不出哪里会影响性能啊!
0 请登录后投票
   发表时间: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来思考问题,但是实际上遇到具体问题的时候,确不是那么简单,必须迁就一些东西,我知道有所得当然也有所失,至于失去多少是要具体权衡得。
0 请登录后投票
   发表时间:2004-01-09  
这样的话,thread设代理行不行?
0 请登录后投票
   发表时间:2004-01-09  
引用

如果thread包含一个set posts,那么在我得到thread的时候,hibernate也至少是得到了所有post的id(这是在lazy=true的情况下),本来得到thread列表,是一条sql语句,而现在使用了n+1条(假设一个页面显示n个thread)。当然是不必要的。

不对,看看文档吧

引用

但由于级连,hibernate还是为每一个thread执行了一次为得到子的查询

级连?这和级连有什么关系?
0 请登录后投票
   发表时间: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中所有的对象。
。。。。

我现在的理解是不是正确?黑体字是我不清楚的地方。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics