联合查询:

表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. [汇编] 将字符串里的一个'&'字符换成空格

    ; multi-segment executable file template. data segment ; add your data here! pkey db "press any ...

  2. [JS5] 利用onload执行脚本

    <html> <head> <title>利用onload执行脚本</title> <SCRIPT TYPE="text/JavaScr ...

  3. Linux:常用shell快捷键

    按键 作用 Ctrl+d 键盘输入结束或退出终端 Ctrl+s 暂定当前程序,暂停后按下任意键恢复运行 Ctrl+z 将当前程序放到后台运行,恢复到前台为命令fg Ctrl+a 将光标移至输入行头,相 ...

  4. 深入理解c++构造函数, 复制构造函数和赋值函数重载(operator=)

    注 以下代码编译及运行环境均为 Xcode 6.4, LLVM 6.1 with GNU++11 support, Mac OS X 10.10.2 调用时机 看例子 // // main.cpp / ...

  5. ASP.NET MVC简单编程之(二)经典路由篇

    话题:请求从路由开始 在实际的ASP.NET MVC开发中,URL访问规则----路由的定义是非常重要的.因为任何一个请求都离不开路由.理解它,我们将能理解MVC处理请求的整个过程,灵活地定义系统各种 ...

  6. paip.提升效率---request自动绑定domain object

    paip.提升效率---request自动绑定domain object #.keyword,subtitle关键字,子标题 ------------------------- 复制request属性 ...

  7. Django基础——Form&Ajax篇

    一 Form 在实际的生产环境中,登录和注册时用户提交的数据浏览器端都会使用JavaScript来进行验证(比如验证输入是否为空以及输入是否合法),但是浏览器可能会禁用JavaScirpt,同时也有人 ...

  8. Java band [Cite]

    SampleModel  取样模型Databuffer 数据缓冲区 Raster 光栅Sample 样本band  带 SampleModel是java awt中的一个抽象类,它定义了一个接口,用于提 ...

  9. WORD2003电子签名插件(支持手写、签章)

    1.引言 WORD电子签名插件,支持手写.本地电子图章.以及网络图章功能.软件使用VC6,以ATL方式编写,软件小巧精致. 这是我学习ATL的成果,学习过程及程序的编写,前前后后共用了一个多月的时间, ...

  10. 携程Android App插件化和动态加载实践

    携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验.本文将详细介绍Android平台插件式开发和动态加载技术的原理和实 ...