日期:2014-05-18  浏览次数:20733 次

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在数据库中不存在,可以嘛?


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>
------解决方案--------------------



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( 大家有没有什么不错的JSP的案例的那种书啊,推荐一本咯,谢谢谢谢:)