当前位置: 代码迷 >> J2EE >> hql 语句多表联合查询解决办法
  详细解决方案

hql 语句多表联合查询解决办法

热度:22   发布时间:2016-04-22 01:23:07.0
hql 语句多表联合查询
现有需求如下:在数据库中有表一名为test1,属性有cid.cname,cpwd;表二名为test2,属性有did,dname,dpwd,并且两张表都在项目中又实体类映射,现在项目中有实体类映射test,属性为cid,cname,cpwd,did,dname,dpwd,我想写个hql语句,查询表test1与表test2,查询语句为:

  String sql="select CName,DName from Test1 test1,Test2 test2 where test1.Cid=test2.Did";

怎么才能把返回的list属性为test呢?不是test1,也不是test2,而是test呢?而这个test在数据库中不存在,可以嘛?

Java code
public List<Test> getAll()    {        String sql="select CName,DName from Test1 test1,Test2 test2 where test1.Cid=test2.Did";                return (List<Test>)super.find(sql);    }


------解决方案--------------------
1、将Test定义为一个Bean
2、提供默认构造函数和一个有参数的构造函数,这个有参数的构造函数的参数分别为cid,cname,cpwd,did,dname,dpwd
3、String sql="select new Test(cid,cname,cpwd,did,dname,dpwd
) from Test1 c,Test2 d where c.Cid=d.Did";

执行返回List<Test>
------解决方案--------------------
Java code
import java.util.ArrayList;import java.util.Collections;import java.util.Date;import java.util.List;import java.util.Vector;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.Transaction;import y.model.Test;import y.model.Test1;import y.model.Test2;import com.targ.track.financeManager.buildProjectAccount.domain.BuildProjectAccount;import com.targ.track.financeManager.buildProjectAccount.domain.BuildProjectAccountDetail;import com.targ.track.startAppManager.domain.StartApplication;public class MyJunitTest {    @org.junit.Test    public void testDDL(){        //插入数据        HibernateTest.doInHibernateSession(new InHibernateSession(){            @Override            public Object doInHibernateSession(Session session) {                Test1 test1 = new Test1();                test1.setCAgo("CAgo");                test1.setCName("CName");                test1.setCPwd("CPwd");                test1.setCSex("CSex");                Test2 test2 = new Test2();                test2.setDAddr("DAddr");                test2.setDAge(123);                test2.setDName("DName");                test2.setDPwd("DPwd");                test2.setDSex("DSex");                session.save(test1);                session.save(test2);                return null;            }        });        //查询         List<Test> all = (List<Test>) HibernateTest.doInHibernateSession(new InHibernateSession(){            public Object doInHibernateSession(Session session) {                String sql="select new y.model.Test(c.CId,c.CName,d.DId,d.DName) from Test1 c,Test2 d where c.CId=d.DId";                Query query = session.createQuery(sql);                return query.list();            }        });         for(Test test : all){             System.out.println(test);         }            }    public static class HibernateTest {        public static Object doInHibernateSession(InHibernateSession doInHibernateSession){            Session session = HibernateSessionFactory.getSession();            Transaction transaction = session.beginTransaction();            try{                Object object =  doInHibernateSession.doInHibernateSession(session);                transaction.commit();                return object;            }catch(RuntimeException e){                try{                    System.err.println("rollback");                    transaction.rollback();                }catch(RuntimeException ex){                    System.err.println("回滚失败!");                }                throw e;            }finally{                //HibernateSessionFactory.closeSession();            }        }    }    public interface InHibernateSession {        public Object doInHibernateSession(Session session);    }}
  相关解决方案