聯合查詢:java
表1: team球隊表 表2:schedule 賽程表sql
須要數據:數據庫
球隊名稱、主隊ID、主隊名稱、客隊ID、客隊名稱、勝負狀況數組
方法1. Object數組取出列和數值session
import java.util.List; import junit.framework.TestCase; import org.hibernate.SQLQuery; import org.hibernate.Session; import org.junit.Test; import com.nubb.db.HibernateUtil; import com.nubb.db.career.CareerDaoFactory; import com.nubb.po.User; import com.nubb.po.career.CareerTeam; import com.nubb.vo.career.VoCareerTodaySchedule; /** * * @description * * @classname THHCareerDAO * @author maoyun<maoyun@nubb.com> * @date 2013-9-6 上午09:41:32 * @version 1.0 */ public class THHCareerDAO extends TestCase{ private Session _session = null; private Session _getSession(){ _session = HibernateUtil.currentSession(); return _session; } private void _close(){ HibernateUtil.closeSession(); } @Test public void testCombinePojo(){ this._getSession(); SQLQuery q = _session.createSQLQuery("SELECT * FROM user WHERE uid = '000000000009'");
// Object obj = _session.get(User.class, "000000000009");
// Object obj = q.uniqueResult();
Object obj this._close(); //POJO實體對象能夠將get函數所得的Object對象強轉(其餘方式查詢到的單條記錄強轉會報錯) User user = (User) obj; System.out.println(new String(user.getTeamName())); System.out.println(user.getCity()); //SQL查詢得出惟一結果爲: Object數組 , 字段名被忽略,用數組的下標依次表示! 如: id name ... 在數組中對應的就是 obj[0] obj[1] Object[] obj1 = (Object[]) obj; byte[] b = ((byte[])obj1[1]); // String str = new String(b); System.out.println(str); String sss = new String(); for (int i = 0; i < b.length; i++) { sss+=b[i]; } byte[] c = ((byte[])obj1[2]); String stri = new String(c); System.out.println(stri); String ccc = new String(); for (int i = 0; i < c.length; i++) { ccc+=c[i]; } System.out.println(obj1[0]+"..."+ sss +"..." + ccc +"..." + obj1[3]+"..." + obj1[4]); } }
方法2(推薦). 建立臨時對象(vo),利用ide
session.createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(VoCareerTodaySchedule.class))方法來將屬性值set進臨時對象中(VoCareerTodaySchedule對象中加入相應的set和get方法便可)函數
3. 如在聯合查詢中須要輔表同一字段(這種狀況常見,好比:在賽程表中,現須要獲取將來幾天的比賽賽程,其中就確定有兩個字段來記錄主、客隊,兩者兩字段都是來自於同一表)
首先都會想到用as關鍵字來區分兩字段,在數據庫裏直接執行是沒錯的,可是用Hibernate中Session的createSQLQuery方法就會報錯Column 'name' not found.
後來試了一下前一個字段不用,後一個字段用了就能查出來,可是後一個字段是nullui
最後才知道應該另加上addScalar(column_name)方法來區分
sql:this
Query q = session.createSQLQuery(sql) .addScalar("h_name").addScalar("v_name") .setResultTransformer(Transformers.aliasToBean(VoCareerTodaySchedule.class));
查詢:spa
/** * 當前賽程<br/> * 賽程表+球隊表<br/> * @description * @param time 10位數開始時間 * @title getCurrentDayList */ public List<VoCareerTodaySchedule> getCurrentDayList(long time) { try { this._VerifyParam(time); } catch (HHParamVerifyException e) { return null; } String sql = "SELECT cps.id , cps.home_cid , ct1.name as h_name , cps.visit_cid , ct2.name as v_name, cps.pk_date , cps.win " + "FROM career_pk_schedule cps , career_team ct1 , career_team ct2 " + "WHERE cps.home_cid = ct1.id AND cps.visit_cid = ct2.id " + "AND cps.`status` = 0 AND cps.pk_date = " + time ; Session session = HibernateUtil.currentSession(); Query q = session.createSQLQuery(sql) .addScalar("h_name").addScalar("v_name") .setResultTransformer(Transformers.aliasToBean(VoCareerTodaySchedule.class)); List<VoCareerTodaySchedule> list = q.list(); HibernateUtil.closeSession(); return list.isEmpty() ? null : list; }
vo對象:
/** * * @description * * @classname CareerTeamPkSchedule * @author maoyun<maoyun@nubb.com> * @date 2013-9-24 下午03:09:40 * @version 1.0 */ public class VoCareerTodaySchedule { private int id; private int home_cid; private String h_name; private int visit_cid; private String v_name; private int pk_date; private int win; public int getId() { return id; } public void setId(int id) { this.id = id; } public int getHome_cid() { return home_cid; } public void setHome_cid(int home_cid) { this.home_cid = home_cid; } public int getVisit_cid() { return visit_cid; } public void setVisit_cid(int visit_cid) { this.visit_cid = visit_cid; } public int getPk_date() { return pk_date; } public void setPk_date(int pk_date) { this.pk_date = pk_date; } public int getWin() { return win; } public void setWin(int win) { this.win = win; } public String getV_name() { return v_name; } public String getH_name() { return h_name; } public void setH_name(String h_name) { this.h_name = h_name; } public void setV_name(String v_name) { this.v_name = v_name; }
//調試用 @Override public String toString() { return "VoCareerTodaySchedule [id=" + id + ", home_cid=" + home_cid + ", h_name=" + h_name + ", visit_cid=" + visit_cid + ", v_name=" + v_name + ", pk_date=" + pk_date + ", win=" + win + "]"; }
由於其原理是根據Select後的column name 對vo臨時對象進行set值,因此能夠顛倒vo對象中字段的順序,也能夠添加多餘的字段,還能夠去除現有字段....
好比: 現對VoCareerTodaySchedule對象添加一個屬性,可是查詢的字段並無它,結果可執行,但值爲null
同理對VoCareerTodaySchedule對象去掉id屬性和set/get方法,查詢語句中依然不變,結果可執行。 沒有意義