联合查询:

表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方法,查询语句中依然不变,结果可执行。   没有意义

使用SQL联合查询来构建临时vo对象的应用的更多相关文章

  1. SQL联合查询:子表任一记录与主表联合查询

    今天有网友群里提了这样一个关于SQL联合查询的需求: 一.有热心网友的方案: 二.我的方案: select * from ( select a.*,(select top 1 Id from B as ...

  2. SQL联合查询(内联、左联、右联、全联)的语法(转)

    最近在做一个比较复杂的业务,涉及的表较多,于是在网上找了一些sql联合查询的例子进行研究使用. 概述: 联合查询效率较高,举例子来说明联合查询:内联inner join .左联left outer j ...

  3. SQL联合查询两个表的数据

    刚有个项目,需要查询水位数据表中的水位信息,及查询降雨量表中统计时段降雨量的数据,以计算出日降雨量,而且时段是前一天8时到后一天8时总共24个小时. 两个子查询: 1.根据当前时间判断统计前天8时到今 ...

  4. SQL联合查询(内联、左联、右联、全联)语法

    SQL联合查询(内联.左联.右联.全联)语法 概述: 联合查询效率较高,举例子来说明联合查询:内联inner join .左联left outer join .右联right outer join  ...

  5. SQL联合查询(内联、左联、右联、全联)的语法

    联合查询效率较高,举例子来说明联合查询:内联inner join .左联left outer join .右联right outer join .全联full outer join 的好处及用法. 联 ...

  6. 记一次SQL联合查询注入工具的编写

    这是一个ASP网站的简单SQL注入检测和利用的工具,主要的功能是简单的检测出SQL注入漏洞,可以使用该id存在的SQL注入来获取数据库中的网站管理员的表名和字段名,猜解数据库中该表的字段数,最后通过联 ...

  7. sql联合查询

    联合查询效率较高.以下例子来说明联合查询的好处 t1表结构(用户名,密码)    userid int         username   varchar(20)     password      ...

  8. sql联合查询去除重复计算总和

    1.首先来个联合查询 SELECT 字段1, 字段2, 字段3, 字段4 FROM 表1 INNER JOIN 表2 ON 表1.字段x = 表2.字段x x:代表随意的一个,只要在联合查询的两张表都 ...

  9. SQL联合查询中的关键语法(转)

    联合查询效率较高.以下例子来说明联合查询的好处 t1表结构(用户名,密码)    userid int         username   varchar(20)     password      ...

随机推荐

  1. [J2ME] 获得MIDlet信息

    import javax.microedition.lcdui.Display; import javax.microedition.lcdui.Form; import javax.microedi ...

  2. 服务器端json数据文件分割合并解决方案

    问题引入 Json 是什么就不多说了,本文把Json理解成一种协议. 印象之中,Json貌似是前端的专属,其实不然,服务器端组织数据,依然可以用Json协议. 比如说,某公司有一套测评题目(基于Jso ...

  3. win32汇编hello world

    下载:http://www.masm32.com/ 安装masm32 建一个Var.bat文件并运行 @echo offset include=E:\masm32\includeset lib=E:\ ...

  4. paip. 定时 关机 休眠 的总结

    paip. 定时 关机 休眠 的总结 //////////////////title bat shell 批处理日期时间的使用比较. bat shell 批处理if else 多行.. 作者Attil ...

  5. HDU 1711 Number Sequence (KMP)

    白书说这个是MP,没有对f 数组优化过,所以说KMP有点不准确 #include <stdio.h> int a,b; int T[1000010],P[10010];//从0开始存 in ...

  6. TexturePacker压缩png的命令

    压缩png效果最好的当然是TinyPNG这种神器了,不过一般情况下TexturePacker压缩出来的也基本上能达到效果. 你需要先安装TP(TexturePacker的简称,以下TP无特殊说明均指T ...

  7. 努力学习 HTML5 (4)—— 浏览器对语义元素的支持情况

    经过上一节学习,我们已经建立一个结构良好的页面,如果在旧版的 IE 浏览器中浏览可能这些语义元素无法显示. 毕竟这些语义元素什么也不做,要支持它们,只要让浏览器把它们当做普通的 <div> ...

  8. Initializing a collection

    Before Java 1.7, only this one is permitted: ArrayList<String> a = new ArrayList<String> ...

  9. 从零开始--系统深入学习IOS(使用Swift---带链接)

    这是一篇面向IOS新手的文档.同时提供一些系统知识的链接,让你系统学习IOS.它提供一些信息帮助你采用技术和编程接口来开发苹果软件产品,本人不保证会在将来更新.学习它,需要你掌握一些基本的编程知识 1 ...

  10. jsnop

    <script src="http://libs.baidu.com/jquery/1.6.1/jquery.min.js"></script> <d ...