使用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 ...
随机推荐
- [JS3] 立即执行JS
<html> <head> <title>立即执行</title> <SCRIPT TYPE="text/JavaScript" ...
- 使用SharePoint CSOM 编写高效的程序
上一篇文章中简单的介绍了使用CSOM进行编程.今天主要讲一下CSOM使用中一些小技巧,可以让你的程序运行的更快. 单独加载某些属性 在上文中的例子,需要返回Web对象信息的时候,我们使用了如下的代码: ...
- Cocos2d-x3.6 Android编译问题
在Cocod2d-x论坛上看到越来越多人吐槽新版本更新太快,改动太大,而且经常有BUG导致升级要折腾很久很久..但我就是喜欢折腾,喜欢升级到最新版本,看看有了哪些新功能,哪些改进.为此也折腾了不少,遇 ...
- 使用grunt打包ueditor源代码
支持版本支持 UEditor 1.3.0+ 的版本 使用方法1.线上下载ueditor下载地址:ueditor,要下载"完整版 + 源码" 2.安装nodejs下载nodejs并安 ...
- 汇编语言hello world
DOS下: ;栈段 stack segment stack db dup(?) stack ends ;数据段 data segment szHello db 'Hello,world',0dh,0a ...
- atitit. groupby linq的实现(1)-----linq框架选型 java .net php
atitit. groupby linq的实现(1)-----linq框架选型 java .net php 实现方式有如下 1. Dsl/ Java8 Streams AP ,对象化的查询api , ...
- ESXi5 中克隆Linux虚拟主机的网络配置
虚拟化技术果然非常方便,尤其是windows主机,克隆后在网络管理中改一下IP即可. 但对于Linux来说就有点麻烦,只修改IP还不行,还有MAC地址,网卡指定等,这个规程对应新手来说没有大半天搞不定 ...
- 【Cocos2d-x】VS2012开发2dx无法解析的外部符号解决记录(第一篇)【转】
come from http://acoder.me/cocos2d-unresolved-external-symbol.html 看到cocos2d-x带了扩展包,心动的想尝试下,以下分享下我使用 ...
- WebSocket桌面客户端工具
考虑到WebSocket的诸多优点和未来的趋势,去年底把服务端通讯全部由HTTP改成WebSocket,期间为了方便测试,做了这个小工具.共享出来以方便有同样需求的程序员. 下载的压缩包里含有源代码和 ...
- Enclosure POJ
0:Enclosure http://poj.openjudge.cn/challenge3/0/ 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 131072kB 描述 为了防止 ...