hql 语句多表联合查询解决办法
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在数据库中不存在,可以嘛?
------解决方案--------------------
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>
------解决方案--------------------
现有需求如下:在数据库中有表一名为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); } }