在使用hibernate的时候遇到一个延迟加载的问题小弟一直没弄懂:
如何做到不用在映射文件里配置lazy=false通过hql语句查询控制是否使用延迟加载
这个说起来有点麻烦看一个例子吧
一个主表实体TestTable对应多个明细表实体TestDetailTable,通过字段mainId关联//主表
import TestTable;
//明细表
import TestDetailTable;
testDao{
    //这个方法使用默认的延迟加载,明细表在读取的时候再查询。
    List<TestTable> list(){
        String hql = 'from TestTable';
    }    //这个方法不使用延迟加载,直接将主表和明细表的信息一次性全查出来
    //要求返回的主表信息和第一个方法一样的list
    List<TestTable> listWithDetail(){
        //TODO 这里hql如何写???
        String hql = '';
    }
    
    //这个方法不使用延迟加载,只查找主表信息不查明细表信息,避免session失效的异常
    //要求返回的主表信息和第一个方法一样的list
    List<TestTable> listNoDetail(){
        //TODO 这里hql如何写???
        String hql = '';
    }
}
请教:第二个和第三个方法的hql如何写,
特别强调的是返回的主表信息数据结构必须和第一个方法一样,不更改变返回类型,比如不能返回为数组,要求唯一不同的是在是否和或何时查询明细表的信息

解决方案 »

  1.   

    在进行一对多或者一对一、多对一的时候配置@OneToOne(fetch=FetchType.LAZY)表示延迟加载
      

  2.   

    像老紫竹说的 在查询完毕后马上调用延迟加载的对象 于是加载了 或者通过join语句来完成他
    不过 无论如何 延迟加载都是设置成true的 既然想用程序判断是否延迟加载的话 
      

  3.   

    使用表连接查询,fetch="true"不过在有多个表的时候最好不要用,会有错误结果出现
      

  4.   

    自己在hql语句中写join fetch(好像是这么写的)
      

  5.   

    String hql = "select distinct b from Business b join fetch b.fees join fetch b.account  where 1=1 ";不知道LZ是不是想实现这样的事情,把关联的纪录查询出来,