Hibernate 多表关联查询示例
2016-07-13 10:49
393 查看
TSettlementPaymentRec,TIsvSettlement,TC001CorpMessage三个Java Bean映射于T_Isv_Settlement,T_Isv_Settlement_Attach
, T_C001_Corp_Messag表
其中T_Isv_Settlement,T_Isv_Settlement_Attach , T_C001_Corp_Messag 已经有主外键关联关系,所以在where条件中用
‘ AND t.TIsvSettlement=t2 AND t2.TC001CorpMessage=t3’表示关联关系。
testHSQL(){
String HSQL=" select t.voucherno, t2.memo, t3.name
FROM TSettlementPaymentRec t , TIsvSettlement t2 , TC001CorpMessage t3 " +
" WHERE t2.settlementid = 'S2011042000066' AND t.TIsvSettlement=t2 AND t2.TC001CorpMessage=t3";
List ltest=this.findByHSQL(HSQL);
}
/**
* 根据HQL查询字符串来返回实例集合对象
*
* @param querySql HQL查询字符串
*
* @return 返回object
*/
public List findByHSQL(final String querySql) {
try {
List obj = getHibernateTemplate().find(querySql);
if (obj != null) {
return obj;
} else {
return null;
}
} catch (RuntimeException re) {
throw re;
}
}
=========================================================================
各文件属性定义(部分)
TSettlementPaymentRec.java:
public class TSettlementPaymentRec implements java.io.Serializable {
// Fields
private String paymentid;
private TIsvSettlement TIsvSettlement;
private Double settlementnum;
private Double amount;
private String voucherno;
private String paymenttype;
private Date paymenttime;
private String userid;
private String source;
}
TC001CorpMessage.java:
public class TC001CorpMessage implements java.io.Serializable {
// Fields
private String userid;
private String name;
private String password;
private String email;
private String type;
private String corpname;
private String commaddress;
private String commcall;
private Integer zipcode;
private String orgcode;
private String registcode;
private String registaddress;
private String legalname;
private String fax;
private String contact;
private String username;
private String identity;
private String mobile;
private String industry;
private BigDecimal integrity;
private BigDecimal credit;
private BigDecimal settlespan;
private Date createtime;
}
TIsvSettlement.java
public class TIsvSettlement implements java.io.Serializable {
// Fields
private String settlementid;
private TC001CorpMessage TC001CorpMessage;
private Double settlementnum;
private Double sum;
private Date settlementTime;
private String sendmState;
private Date sendmTime;
private String sendmId;
private String receivemState;
private Date receivemTime;
private String recrivemId;
private String state;
private String memo;
private Set TIsvSettlementAttachs = new HashSet(0);
}
TIsvSettlementAttach.java
public class TIsvSettlementAttach implements java.io.Serializable {
// Fields
private String id;
private TIsvSettlement TIsvSettlement;
private String isvproductno;
private String usernum;
private String amount;
private String settleSum;
private String sum;
private Date createtime;
private String isvuserid;
private String productid;
private String unit;
private Double price;
private Long buytimes;
private Double amount2;
private Date begintime;
private Date disabletime;
private String userid;
private String username;
===========================================================================================================================================================
例子2:
String HSQL=" select t.voucherno, t2.settleSum, t3.name FROM TSettlementPaymentRec t , TIsvSettlementAttach t2 , TC001CorpMessage t3 " +
" WHERE t2.TIsvSettlement.settlementid = 'S2011042000066' AND t.TIsvSettlement=t2.TIsvSettlement AND t2.isvuserid=t3.userid";
List ltest=this.findByHSQL(HSQL);
取结果:
ArrayList sList = (ArrayList) result;
Iterator iterator1 = sList.iterator();
while (iterator1.hasNext()) {
Object[] o = (Object[]) iterator1.next();
tBookInfo bookInfo = (tBookInfo) o[0];
BookSelection bookSelect = (BookSelection) o[1];
System.out.println("BookInfo-Title: " + bookInfo.getTitle());
System.out.println("BookSelection-BookSelectionId: " + bookSelect.getId());
}
例子3:
String HSQL=" select t2.settleSum, t3.name,t4.name FROM TIsvSettlementAttach t2 , TC001CorpMessage t3,TCusProduct t4 " +
" WHERE t2.id like '405' AND t2.isvuserid=t3.userid AND t4.productid=t2.productid";
List ltest=this.findByHSQL(HSQL);
int i=0;
例子4,去重复记录:
String HSQL=" select distinct t2.settleSum, t3.name,t4.name FROM TIsvSettlementAttach t2 , TC001CorpMessage t3,TCusProduct t4 " +
" WHERE t2.isvuserid=t3.userid AND t4.productid=t2.productid";
List ltest=this.findByHSQL(HSQL);
例子5,LIKe查询:
String HSQL=" select t2.settleSum, t3.name,t4.name FROM TIsvSettlementAttach t2 , TC001CorpMessage t3,TCusProduct t4 " +
" WHERE t3.name like '%三' AND t2.isvuserid=t3.userid AND t4.productid=t2.productid";
==================================================================================================================
Hibernate 对左右连接查询的支持不完善,需要做配置XML文件和关联关系才行,比较复杂,对于任意表字段的外连接无法支持。
简单的 做法是用SQL语法把外连接翻译成内连接语法,
Oracle SQL1:
select t3.userid,t2.isvuserid,t2.settle_Sum, t3.name from T_Isv_Settlement_Attach t2 , T_C001_Corp_Message t3 where t2.isvuserid(+)=t3.userid;
等于SQL2:
select null as isvuserid,null as settle_Sum ,t3.userid, t3.name
from T_C001_Corp_Message t3 where t3.userid not in (select t2.isvuserid from T_Isv_Settlement_Attach t2 , T_C001_Corp_Message t3 where t2.isvuserid=t3.userid)
union all
select t2.isvuserid,t2.settle_Sum, t3.userid,t3.name from T_Isv_Settlement_Attach t2 , T_C001_Corp_Message t3 where t2.isvuserid=t3.userid;
Hibernate 对 Union不支持。
所以SQL2还必须用两条SQL来做,然后把2个结果集用LIST对象合并list1.addAll(),结果集出来后,还会有排序问题,
就必须自己实现List类中的排序,可以参考这个函数的做法,实现排序类:
import java.util.*;
public class testClass2 {
/**
* @param args
*/
public static void main(String[] args) {
TIsvSettlementAttach tisv1 = new TIsvSettlementAttach();
tisv1.setId("333");
TIsvSettlementAttach tisv2 = new TIsvSettlementAttach();
tisv2.setId("222");
TIsvSettlementAttach tisv3 = new TIsvSettlementAttach();
tisv3.setId("111");
List<TIsvSettlementAttach> list = new ArrayList<TIsvSettlementAttach>();
list.add(tisv1);
list.add(tisv2);
list.add(tisv3);
System.out.println("排序前的list:");
System.out.println(list);
Collections.sort(list, new Comparator<TIsvSettlementAttach>() {
public int compare(TIsvSettlementAttach o1, TIsvSettlementAttach o2) {
// 取出操作时间
int ret = 0;
try {
ret = (o1.getId()).compareTo(
o2.getId());
} catch (Exception e) {
throw new RuntimeException(e);
}
return ret;
}
});
System.out.println("排序后的list:");
System.out.println(list);
}
}
例如:student表和score表需要做联合查询。
1)sql: select s.id,s.name,sc.score from student as s,score as sc where s.id = sc.userId;
(字段都是用的数据库中字段名称)
2)HQL: select s.id,s.name,sc.score from Student as s,Score as sc where s.id = sc.userId;
(上面字段都是 javabean的属性)
如果我们按1)查询的话,必须调用 session.createSQLQuery();方法
如果按2)查询,还是调用 session.createQuery();
只是要注意,平时我们查询的时候,例如:“from
Student ”查询的结果集 封装的全都是student对象,但是2)执行的结果集里面不是对象,而是一系列数组。需要转换成需要的样式。Hibernate 对左右连接查询的支持不完善,需要做配置XML文件和关联关系才行,比较复杂,对于任意表字段的外连接无法支持。
下面 是查询的一段代码:
Session session = getHibernateTemplate().getSessionFactory()
.getCurrentSession();
StringBuffer sb = new StringBuffer(" select user.username,user.truename,user.sex,user.idnum,user.level,s.sumScore from Score as
s,Examuser as user where s.id.userId = user.id ");
if(score != null){
if(score.getExamId()!=null && !"".equals(score.getExamId())
&& !"null".equals(score.getExamId())){
sb.append(" and s.examId =:examId ");
}
if(score.getExamPlace()!=null && !"".equals(score.getExamPlace())
&& !"null".equals(score.getExamPlace())){
sb.append(" and s.examPlace =:examPlace ");
}
if(score.getUsername()!=null && !"".equals(score.getUsername())
&& !"null".equals(score.getUsername())){
sb.append(" and s.username like:username ");
}
}
sb.append(" order by s.sumScore desc ");
Query q = session.createQuery(sb.toString());
if(score != null){
if(score.getExamId()!=null && !"".equals(score.getExamId())
&& !"null".equals(score.getExamId())){
q.setParameter("examId",score.getExamId());
}
if(score.getExamPlace()!=null && !"".equals(score.getExamPlace())
&& !"null".equals(score.getExamPlace())){
q.setParameter("examPlace",score.getExamPlace());
}
if(score.getUsername()!=null && !"".equals(score.getUsername())
&& !"null".equals(score.getUsername())){
q.setParameter("username","%"+score.getUsername()+"%");
}
}
List list = q.list();
需要将查询的结果集 进行一下转换:
List stuList = scoreService.findAllScore(queryScore, null); // 返回的结果集
if(stuList != null && stuList.size()>0){
list = new LinkedList();
StudentScore st;
for(int i = 0; i < stuList.size();i++){
st = new StudentScore();
Object[] object = (Object[])stuList.get(i);// 每行记录不在是一个对象 而是一个数组
String userId = (String)object[0];
String username = (String)object[1];
String truename = (String)object[2];
String sex = (String)object[3];
String idnum = (String)object[4];
String level = (String)object[5];
Double sumScore = Double.parseDouble(String.valueOf(object[6]));
String paperId = (String)object[7];
// 重新封装在一个javabean里面
st.setUserId(userId);
st.setUsername(username);
st.setTruename(truename);
st.setIdnum(idnum);
st.setLevel(DictSwitch.getValue("DICT_LEVEL",level));
st.setSex(DictSwitch.getValue("DICT_SEX",sex));
st.setPaperId(paperId);
st.setSumScore(sumScore);
st.setExamplace(DictSwitch.getValue("DICT_EXAMSTATION",examplace));
list.add(st); // 最终封装在list中 传到前台。
}
, T_C001_Corp_Messag表
其中T_Isv_Settlement,T_Isv_Settlement_Attach , T_C001_Corp_Messag 已经有主外键关联关系,所以在where条件中用
‘ AND t.TIsvSettlement=t2 AND t2.TC001CorpMessage=t3’表示关联关系。
testHSQL(){
String HSQL=" select t.voucherno, t2.memo, t3.name
FROM TSettlementPaymentRec t , TIsvSettlement t2 , TC001CorpMessage t3 " +
" WHERE t2.settlementid = 'S2011042000066' AND t.TIsvSettlement=t2 AND t2.TC001CorpMessage=t3";
List ltest=this.findByHSQL(HSQL);
}
/**
* 根据HQL查询字符串来返回实例集合对象
*
* @param querySql HQL查询字符串
*
* @return 返回object
*/
public List findByHSQL(final String querySql) {
try {
List obj = getHibernateTemplate().find(querySql);
if (obj != null) {
return obj;
} else {
return null;
}
} catch (RuntimeException re) {
throw re;
}
}
=========================================================================
各文件属性定义(部分)
TSettlementPaymentRec.java:
public class TSettlementPaymentRec implements java.io.Serializable {
// Fields
private String paymentid;
private TIsvSettlement TIsvSettlement;
private Double settlementnum;
private Double amount;
private String voucherno;
private String paymenttype;
private Date paymenttime;
private String userid;
private String source;
}
TC001CorpMessage.java:
public class TC001CorpMessage implements java.io.Serializable {
// Fields
private String userid;
private String name;
private String password;
private String email;
private String type;
private String corpname;
private String commaddress;
private String commcall;
private Integer zipcode;
private String orgcode;
private String registcode;
private String registaddress;
private String legalname;
private String fax;
private String contact;
private String username;
private String identity;
private String mobile;
private String industry;
private BigDecimal integrity;
private BigDecimal credit;
private BigDecimal settlespan;
private Date createtime;
}
TIsvSettlement.java
public class TIsvSettlement implements java.io.Serializable {
// Fields
private String settlementid;
private TC001CorpMessage TC001CorpMessage;
private Double settlementnum;
private Double sum;
private Date settlementTime;
private String sendmState;
private Date sendmTime;
private String sendmId;
private String receivemState;
private Date receivemTime;
private String recrivemId;
private String state;
private String memo;
private Set TIsvSettlementAttachs = new HashSet(0);
}
TIsvSettlementAttach.java
public class TIsvSettlementAttach implements java.io.Serializable {
// Fields
private String id;
private TIsvSettlement TIsvSettlement;
private String isvproductno;
private String usernum;
private String amount;
private String settleSum;
private String sum;
private Date createtime;
private String isvuserid;
private String productid;
private String unit;
private Double price;
private Long buytimes;
private Double amount2;
private Date begintime;
private Date disabletime;
private String userid;
private String username;
===========================================================================================================================================================
例子2:
String HSQL=" select t.voucherno, t2.settleSum, t3.name FROM TSettlementPaymentRec t , TIsvSettlementAttach t2 , TC001CorpMessage t3 " +
" WHERE t2.TIsvSettlement.settlementid = 'S2011042000066' AND t.TIsvSettlement=t2.TIsvSettlement AND t2.isvuserid=t3.userid";
List ltest=this.findByHSQL(HSQL);
取结果:
ArrayList sList = (ArrayList) result;
Iterator iterator1 = sList.iterator();
while (iterator1.hasNext()) {
Object[] o = (Object[]) iterator1.next();
tBookInfo bookInfo = (tBookInfo) o[0];
BookSelection bookSelect = (BookSelection) o[1];
System.out.println("BookInfo-Title: " + bookInfo.getTitle());
System.out.println("BookSelection-BookSelectionId: " + bookSelect.getId());
}
例子3:
String HSQL=" select t2.settleSum, t3.name,t4.name FROM TIsvSettlementAttach t2 , TC001CorpMessage t3,TCusProduct t4 " +
" WHERE t2.id like '405' AND t2.isvuserid=t3.userid AND t4.productid=t2.productid";
List ltest=this.findByHSQL(HSQL);
int i=0;
例子4,去重复记录:
String HSQL=" select distinct t2.settleSum, t3.name,t4.name FROM TIsvSettlementAttach t2 , TC001CorpMessage t3,TCusProduct t4 " +
" WHERE t2.isvuserid=t3.userid AND t4.productid=t2.productid";
List ltest=this.findByHSQL(HSQL);
例子5,LIKe查询:
String HSQL=" select t2.settleSum, t3.name,t4.name FROM TIsvSettlementAttach t2 , TC001CorpMessage t3,TCusProduct t4 " +
" WHERE t3.name like '%三' AND t2.isvuserid=t3.userid AND t4.productid=t2.productid";
==================================================================================================================
Hibernate 对左右连接查询的支持不完善,需要做配置XML文件和关联关系才行,比较复杂,对于任意表字段的外连接无法支持。
简单的 做法是用SQL语法把外连接翻译成内连接语法,
Oracle SQL1:
select t3.userid,t2.isvuserid,t2.settle_Sum, t3.name from T_Isv_Settlement_Attach t2 , T_C001_Corp_Message t3 where t2.isvuserid(+)=t3.userid;
等于SQL2:
select null as isvuserid,null as settle_Sum ,t3.userid, t3.name
from T_C001_Corp_Message t3 where t3.userid not in (select t2.isvuserid from T_Isv_Settlement_Attach t2 , T_C001_Corp_Message t3 where t2.isvuserid=t3.userid)
union all
select t2.isvuserid,t2.settle_Sum, t3.userid,t3.name from T_Isv_Settlement_Attach t2 , T_C001_Corp_Message t3 where t2.isvuserid=t3.userid;
Hibernate 对 Union不支持。
所以SQL2还必须用两条SQL来做,然后把2个结果集用LIST对象合并list1.addAll(),结果集出来后,还会有排序问题,
就必须自己实现List类中的排序,可以参考这个函数的做法,实现排序类:
import java.util.*;
public class testClass2 {
/**
* @param args
*/
public static void main(String[] args) {
TIsvSettlementAttach tisv1 = new TIsvSettlementAttach();
tisv1.setId("333");
TIsvSettlementAttach tisv2 = new TIsvSettlementAttach();
tisv2.setId("222");
TIsvSettlementAttach tisv3 = new TIsvSettlementAttach();
tisv3.setId("111");
List<TIsvSettlementAttach> list = new ArrayList<TIsvSettlementAttach>();
list.add(tisv1);
list.add(tisv2);
list.add(tisv3);
System.out.println("排序前的list:");
System.out.println(list);
Collections.sort(list, new Comparator<TIsvSettlementAttach>() {
public int compare(TIsvSettlementAttach o1, TIsvSettlementAttach o2) {
// 取出操作时间
int ret = 0;
try {
ret = (o1.getId()).compareTo(
o2.getId());
} catch (Exception e) {
throw new RuntimeException(e);
}
return ret;
}
});
System.out.println("排序后的list:");
System.out.println(list);
}
}
例如:student表和score表需要做联合查询。
1)sql: select s.id,s.name,sc.score from student as s,score as sc where s.id = sc.userId;
(字段都是用的数据库中字段名称)
2)HQL: select s.id,s.name,sc.score from Student as s,Score as sc where s.id = sc.userId;
(上面字段都是 javabean的属性)
如果我们按1)查询的话,必须调用 session.createSQLQuery();方法
如果按2)查询,还是调用 session.createQuery();
只是要注意,平时我们查询的时候,例如:“from
Student ”查询的结果集 封装的全都是student对象,但是2)执行的结果集里面不是对象,而是一系列数组。需要转换成需要的样式。Hibernate 对左右连接查询的支持不完善,需要做配置XML文件和关联关系才行,比较复杂,对于任意表字段的外连接无法支持。
下面 是查询的一段代码:
Session session = getHibernateTemplate().getSessionFactory()
.getCurrentSession();
StringBuffer sb = new StringBuffer(" select user.username,user.truename,user.sex,user.idnum,user.level,s.sumScore from Score as
s,Examuser as user where s.id.userId = user.id ");
if(score != null){
if(score.getExamId()!=null && !"".equals(score.getExamId())
&& !"null".equals(score.getExamId())){
sb.append(" and s.examId =:examId ");
}
if(score.getExamPlace()!=null && !"".equals(score.getExamPlace())
&& !"null".equals(score.getExamPlace())){
sb.append(" and s.examPlace =:examPlace ");
}
if(score.getUsername()!=null && !"".equals(score.getUsername())
&& !"null".equals(score.getUsername())){
sb.append(" and s.username like:username ");
}
}
sb.append(" order by s.sumScore desc ");
Query q = session.createQuery(sb.toString());
if(score != null){
if(score.getExamId()!=null && !"".equals(score.getExamId())
&& !"null".equals(score.getExamId())){
q.setParameter("examId",score.getExamId());
}
if(score.getExamPlace()!=null && !"".equals(score.getExamPlace())
&& !"null".equals(score.getExamPlace())){
q.setParameter("examPlace",score.getExamPlace());
}
if(score.getUsername()!=null && !"".equals(score.getUsername())
&& !"null".equals(score.getUsername())){
q.setParameter("username","%"+score.getUsername()+"%");
}
}
List list = q.list();
需要将查询的结果集 进行一下转换:
List stuList = scoreService.findAllScore(queryScore, null); // 返回的结果集
if(stuList != null && stuList.size()>0){
list = new LinkedList();
StudentScore st;
for(int i = 0; i < stuList.size();i++){
st = new StudentScore();
Object[] object = (Object[])stuList.get(i);// 每行记录不在是一个对象 而是一个数组
String userId = (String)object[0];
String username = (String)object[1];
String truename = (String)object[2];
String sex = (String)object[3];
String idnum = (String)object[4];
String level = (String)object[5];
Double sumScore = Double.parseDouble(String.valueOf(object[6]));
String paperId = (String)object[7];
// 重新封装在一个javabean里面
st.setUserId(userId);
st.setUsername(username);
st.setTruename(truename);
st.setIdnum(idnum);
st.setLevel(DictSwitch.getValue("DICT_LEVEL",level));
st.setSex(DictSwitch.getValue("DICT_SEX",sex));
st.setPaperId(paperId);
st.setSumScore(sumScore);
st.setExamplace(DictSwitch.getValue("DICT_EXAMSTATION",examplace));
list.add(st); // 最终封装在list中 传到前台。
}
相关文章推荐
- SpringMVC 实例 --非注解【过时的,留作回忆】
- 苹果个人开发者账号申请最新流程
- 不要随意return
- 欢迎使用CSDN-markdown编辑器
- Java程序将amr格式音频转成mp3格式
- spark优化之优化数据结构
- 区块链技术
- ArrayList集合中的字符串数据存储到文本文件|文本文件中读取数据到集合
- 表格样式
- 求5阶矩阵其对角线上所有元素之和
- Java中的异常总结
- JavaScript 字符串与正则表达式系列总结
- Oracle Net Manager 服务命名配置以及用PL/SQL 登陆数据库
- Oracle instr
- 【摘】Mysql中,int(10)和int(11)的区别
- 测试工程师到底是干啥的?测试工程师转开发有多大希望?
- Android图片处理
- L2-012. 关于堆的判断
- git、github、gitlab之间的关系
- jQuery实现div横向拖拽排序的简单实例