我写了个HiberDAOBean.java:
在这个类利用hibernate进行多表查询,得到list,并将list分解,放到Object[] object中。部分代码如下:         session = HibernateUtil.getSession();
tx = session.beginTransaction();
String sql = "from KT as kt, KTType as ktType where kt.typeNo = ktType.typeNo and kt.status = 2";
Query query = session.createQuery(sql);
list = (List)query.list();
         //System.out.println("list.size() = " + list.size());
         Iterator it = list.iterator();
bject[] o = null;
KT kt = null;
KTType ktType = null;
while(it.hasNext()){
   o = (Object[]) it.next();
   kt = (KT) o[0];
   ktType = (KTType) o[1];
            System.out.println("kt.ktNo = " + kt.getKtNo());
   System.out.println("kt.ktName = " + kt.getKtName());
            System.out.println("ktType.ktNo = " + ktType.getTypeNo());
   System.out.println("ktType.ktName = " + ktType.getTypeName());
}
这个类中的方法public Object[] doSelectUserInfoDataFromDB()页面的<form action="select.action" method="post">.....</form>
因为是使用struts2,所以写了个SelectAction类
部分代码如下:HibernateDAOBean hDAOB = new HibernateDAOBean();

o = hDAOB.doSelectUserInfoDataFromDB();//那个o是我之前声明的一个对象数组HttpServletRequest request = ServletActionContext.getRequest();request.setAttribute("list", o);return "success";
然后想到页面上输出,怎么获取?是不是我这个方法不好,有没有更好的办法?大家提提意见!!!!!!小弟我在这谢过了.

解决方案 »

  1.   

    我说明一下,我并没写在映射文件写这两个表之间的关系,也就是POJO类
    KT.javaprivate int ktNo;
    private String ktName;
    private int ktTypeNo;//感觉这样好像是错的,因为这个属性是另一个表的主键KTType.javaprivate int KTTypeNo;
    private String KTTypeName;
    因为KT表的字段ktTypeNo依赖于表KTType的主键,所以要不要把修改字段改成:
    private KTType ktType;
    然后利用KT.hbm.xml文件<one-to-one table="KTType" ....></one-to-one>大家怎么想的?
      

  2.   

    你可以再好好看看hibernate,两表的关系是可以直接在文件中配置好的,
    如果你这么写,是浪费了hibernate开发的功能。
      

  3.   

    String sql = "from KT as kt, KTType as ktType where kt.typeNo = ktType.typeNo and kt.status = 2"
    你知道hibernate会怎么执行这sql么?
    select * from  KT as kt, KTType as ktType where kt.typeNo = ktType.typeNo and kt.status = 2
    你得到的是两表的所有字段值,你怎么能直接给他进行类转换呢?
     KT kt = null;
        KTType ktType = null;        
        while(it.hasNext()){
           o = (Object[]) it.next();        
           kt = (KT) o[0];
           ktType = (KTType) o[1];
      

  4.   

    hibernate表关系好烦人啊
    楼主加油
      

  5.   

    楼主你是不是没forward到你的显示页面?这样request是传不过去值的
      

  6.   

    你这么写是没有错误的,两种写法都是可以的,只不过在使用起来各有优势,如果按你贴代码是写法,通常存储kt比较方便,只要把kttype的id加进去就可以了,否则如果按你下面的写法,就需要根据这个kttype的id把这个对象查出来,然后加到kt中然后再保存。你下面的这个写法比较利于根据关联关系去读取kttype中的值,因为你在检索kt的时候,kttype会被级联出来(当然可以通过lazy的方式提高效率)这样通常比较容易在页面上取通过kt.ktType. KTTypeName可以比较容易取得。我通常组合用,两个都写。只要注意在配置文件中把<one-to-one>中的insert,update都设置为false就可以避免通过两个方式更新一个对象。
      

  7.   

    通常我们会配置kt与kttype的级联关系,然后通过查询kt来关联出来kttype。这样就避免了你查出一个object[]的问题了。
      

  8.   


    你说得有道理,我现在是用了第二种办法,让他返回一个List。如果需要查询第二张表的话,通过KTType可以去查找。
      

  9.   


    你说得有道理,我现在是用了第二种办法,让他返回一个List。如果需要查询第二张表的话,通过KTType可以去查找。