使用SQL聯合查詢來構建臨時vo對象的應用


聯合查詢:

表1: team球隊表    表2:schedule 賽程表

需要數據:

球隊名稱、主隊ID、主隊名稱、客隊ID、客隊名稱、勝負情況

方法1. Object數組取出列和數值

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),利用

session.createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(VoCareerTodaySchedule.class))方法來將屬性值set進臨時對象中(VoCareerTodaySchedule對象中加入相應的set和get方法即可)

3. 如在聯合查詢中需要輔表同一字段(這種情況常見,比如:在賽程表中,現需要獲取未來幾天的比賽賽程,其中就肯定有兩個字段來記錄主、客隊,二者兩字段都是來自於同一表)
首先都會想到用as關鍵字來區分兩字段,在數據庫里直接執行是沒錯的,但是用Hibernate中Session的createSQLQuery方法就會報錯Column 'name' not found.
后來試了一下前一個字段不用,后一個字段用了就能查出來,但是后一個字段是null

最后才知道應該另加上addScalar(column_name)方法來區分
sql:

Query q = session.createSQLQuery(sql)
.addScalar("h_name").addScalar("v_name")
.setResultTransformer(Transformers.aliasToBean(VoCareerTodaySchedule.class));

查詢:

/** 
     * 當前賽程<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方法,查詢語句中依然不變,結果可執行。   沒有意義


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM