使用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方法,查询语句中依然不变,结果可执行。 没有意义
使用SQL联合查询来构建临时vo对象的应用的更多相关文章
- SQL联合查询:子表任一记录与主表联合查询
今天有网友群里提了这样一个关于SQL联合查询的需求: 一.有热心网友的方案: 二.我的方案: select * from ( select a.*,(select top 1 Id from B as ...
- SQL联合查询(内联、左联、右联、全联)的语法(转)
最近在做一个比较复杂的业务,涉及的表较多,于是在网上找了一些sql联合查询的例子进行研究使用. 概述: 联合查询效率较高,举例子来说明联合查询:内联inner join .左联left outer j ...
- SQL联合查询两个表的数据
刚有个项目,需要查询水位数据表中的水位信息,及查询降雨量表中统计时段降雨量的数据,以计算出日降雨量,而且时段是前一天8时到后一天8时总共24个小时. 两个子查询: 1.根据当前时间判断统计前天8时到今 ...
- SQL联合查询(内联、左联、右联、全联)语法
SQL联合查询(内联.左联.右联.全联)语法 概述: 联合查询效率较高,举例子来说明联合查询:内联inner join .左联left outer join .右联right outer join ...
- SQL联合查询(内联、左联、右联、全联)的语法
联合查询效率较高,举例子来说明联合查询:内联inner join .左联left outer join .右联right outer join .全联full outer join 的好处及用法. 联 ...
- 记一次SQL联合查询注入工具的编写
这是一个ASP网站的简单SQL注入检测和利用的工具,主要的功能是简单的检测出SQL注入漏洞,可以使用该id存在的SQL注入来获取数据库中的网站管理员的表名和字段名,猜解数据库中该表的字段数,最后通过联 ...
- sql联合查询
联合查询效率较高.以下例子来说明联合查询的好处 t1表结构(用户名,密码) userid int username varchar(20) password ...
- sql联合查询去除重复计算总和
1.首先来个联合查询 SELECT 字段1, 字段2, 字段3, 字段4 FROM 表1 INNER JOIN 表2 ON 表1.字段x = 表2.字段x x:代表随意的一个,只要在联合查询的两张表都 ...
- SQL联合查询中的关键语法(转)
联合查询效率较高.以下例子来说明联合查询的好处 t1表结构(用户名,密码) userid int username varchar(20) password ...
随机推荐
- Twitter API升级至1.1
Twitter API 1.1是至今最大的一次升级,从3月份提出,到6月11日1.0版本已经全面停止调用.关于1.1版本升级特性可访问: https://dev.twitter.com/docs/ap ...
- web应用性能测试-Tomcat 7 连接数和线程数配置
转自:http://www.jianshu.com/p/8445645b3aff 引言 这段时间折腾了哈java web应用的压力测试,部署容器是tomcat 7.期间学到了蛮多散碎的知识点,及时梳理 ...
- paip.hibernate save 失败的解决
paip.hibernate save 失败的解决 打开log debug level,,看不见insert 代码... Hibernate select max(ID).txt ...
- Axios、Lodash、TweenJS
Axios是一个基于promise的HTTP库 http://chuansong.me/n/394228451820 Lodash是一个JavaScript的函数工具集 http://www.css8 ...
- js系列(8)简介
JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HT ...
- 阿里云产品介绍(二):云服务器ECS的孪生兄弟们
上一篇介绍的云服务器ECS,是阿里云最基础的产品,也是每一个云计算厂商最基础的产品,俗称爆款.除了标准的云服务器,阿里云也不停的在推出面向特殊业务场地的云服务器,可以说是ECS的孪生兄弟们. 这一篇就 ...
- 2016年 最火的 15 款 HTML5 游戏引擎
HTML5游戏从2014年Egret引擎开发的神经猫引爆朋友圈之后,就开始一发不可收拾,今年<传奇世界>更是突破流水2000万!从两年多的发展来看,游戏开发变得越来越复杂,需要制作各种炫丽 ...
- django关闭debug后,静态文件的处理
Django框架仅在开发模式下提供静态文件服务.当我开启DEBUG模式时,Django内置的服务器是提供静态文件的服务的,所以css等文件访问都没有问题,但是关闭DEBUG模式后,Django便不提供 ...
- 机器学习技法--学习笔记03--Kernel技巧
背景 上一讲从对偶问题的角度描述了SVM问题,但是始终需要计算原始数据feature转换后的数据.这一讲,通过一个kernel(核函数)技巧,可以省去feature转换计算,但是仍然可以利用featu ...
- 匿名对象和object的转换
有时候经常用到需要把一个匿名对象存入session或List<object>或其他容器中,可是取出来的时候变成object了,不太方便使用. 下面是一种转换方式: class Pr ...