对象中存在多个集合,且配置文件中设置了懒加载,HQL语句能否做到只获取其中的一个集合?
[b]问题补充:[/b]
使用了left join fetch,但是其他的集合还是查询了。是不是因为配置文件中设置了懒加载呢,如果不修改配置文件,能否做到呢?
[b]问题补充:[/b]
请教一楼的,能给个例子吗?
一句话,Hibernate.initialize(xxx.getList());// 假设list是你要的集合。
hql语句是可以做到的,就用fetch来主动抓取所要的数据,看它文档就知道怎么搞了
HQL可以轻松获得指定属性。
[code="java"]select new VO(column1,column2) from Table[/code]
要指定一个构造方法。
当然也可以直接放到数组中去
[code="java"]select column1,column2 from Table[/code]
还可以这到Map或list中去,
[code="java"]http://huajiang.iteye.com/admin/blogs/473220[/code]
HQL可以轻松获得指定属性。
[code="java"]select new VO(column1,column2) from Table[/code]
要指定一个构造方法。
当然也可以直接放到数组中去
[code="java"]select column1,column2 from Table[/code]
还可以这到Map或list中去,
[url]http://huajiang.iteye.com/blogs/473220[/url]
写hql语句查询应该可以避免懒加载的问题啊
处理懒加载的问题有两个途径
一个是在.hbm.xml文件中 设置lazy="false"
如果是要对关系属性进行设置
就在
或者 中加上就行了
看楼主的问题是 有多个集合 查询的时候只想获得其中的一个
那么 你就在你只需要在你所需要的集合中 加入 lazy="false"
还有一种方法
是你在 通过get 或者 query 拿到所需要对象后
手动的维护一下 其中一个集合的关系就可以了
说白了就是手动的调用 所需要集合中元素的方法
给你举个例子
class A{
Set setb=new HashSet;
Set setc=new HashSet;
public void getSetc(){
...
}
public void getSetb(){
...
}
}
class C{
private Integer id;
private String name;
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
}
class C{
private Integer id;
private String name;
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
}
在调用hibernate操作的时候
如果你只需要获得 setb 集合
A a=session.get(A.class,n);
for(B b:A.getSetb()){
b.getName();
}
commit;
这样 你在A对象中 就只维护了setb
需要注意维护关系的操作 需要放在commit之前
建议使用维护关系的方法
没有办法了 在去配置lazy="false"
呵呵 原因就不用说了 如果你都设置了lazy="false"
那hibernate还设置懒加载干什么啊
上面复制粘贴没注意
一个类是B 另一个是C
并不两个都是C
如果你通过hql方法的话 使用 fetch就可以了
注意的是 你需要哪个集合 就在哪个集合后面加就可以了
至于你说的 在配置文件中设置了懒加载
没明白什么意思
hibernate默认在关系属性中都是懒加载模式
[quote]懒加载 [/quote]
这个东西很麻烦,包括对集合的懒加载和属性的懒加载。
集合的没说头,通过lazy和fetch配置。
属性的就麻烦了,要通过cglib等工具。
要么别做,做了也不如HQL好用