- 浏览: 416886 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
zxjlwt:
学习了http://surenpi.com
java.lang.LinkageError解决办法。 -
zqb666kkk:
/**
*
* @param filepath
...
Java删除目录及目录下的所有文件 -
zqb666kkk:
f.exists() && f.isDirec ...
Java删除目录及目录下的所有文件 -
coldrain2014:
在线api文档 http://online.code1314. ...
JavaMail java.lang.NullPointerException -
timeroading1:
chxkyy 写道xx175194716 写道真佩服,把jar ...
Activiti 学习记录3 之Activiti源代码及默认h2数据库连接
问题:
在Hibernate中,我们经常会碰到多张表通过外键连接来查询表中的数据,需要用到<many-to-one></many-to-one>,<one-to-many></one-to-many>等连接,特别是表之间的连接多了,如果我们通过延迟加载,或立即加载的话。就要多发很多的sql查询语句。
例:
EcssFormula.hbm.xml:
xml 代码
- <class name="com.ecgit.ecss.data.EcssTFormula" table="ECSS_T_FORMULA" schema="ECCM">
- <id name="formulaid" type="java.lang.String">
- <column name="FORMULAID" length="50" />
- <generator class="uuid.hex" />
- id>
- <many-to-one name="ecssTFormulaRestrictByFp" class="com.ecgit.ecss.data.EcssTFormulaRestrict" outer-join="true">
- <column name="FP" length="50" />
- many-to-one>
- <many-to-one name="ecssTFormulaRestrictByFormularesultchildtype" class="com.ecgit.ecss.data.EcssTFormulaRestrict" outer-join="true">
- <column name="FORMULARESULTCHILDTYPE" length="50" />
- many-to-one>
- <many-to-one name="ecssTFormulaRestrictByTp" class="com.ecgit.ecss.data.EcssTFormulaRestrict" outer-join="true" >
- <column name="TP" length="50" />
- many-to-one>
- <many-to-one name="ecssTFormulaRestrictByPro" class="com.ecgit.ecss.data.EcssTFormulaRestrict" outer-join="true" >
- <column name="PRO" length="50" />
- many-to-one>
- <many-to-one name="ecssTFormulaRestrictByCl" class="com.ecgit.ecss.data.EcssTFormulaRestrict" outer-join="true" >
- <column name="CL" length="50" />
- many-to-one>
- <many-to-one name="ecssTFormulaRestrictByPer" class="com.ecgit.ecss.data.EcssTFormulaRestrict" outer-join="true">
- <column name="PER" length="50" />
- many-to-one>
- class>
EcssTFormulaRestrict.hbm.xml:
xml 代码
- <class name="com.ecgit.ecss.data.EcssTFormulaRestrict" table="ECSS_T_FORMULA_RESTRICT" schema="ECCM">
- <id name="restrictid" type="java.lang.String">
- <column name="RESTRICTID" length="50" />
- <generator class="uuid.hex" />
- id>
- <property name="appoint" type="java.lang.String">
- <column name="APPOINT" length="50" />
- property>
- <property name="isany" type="java.lang.String">
- <column name="ISANY" length="10" />
- property>
- <property name="exclude" type="java.lang.String">
- <column name="EXCLUDE" length="100" />
- property>
- <property name="limited" type="java.lang.String">
- <column name="LIMITED" length="100" />
- property>
- <property name="isnull" type="java.lang.String">
- <column name="ISNULL" length="10" />
- property>
- class>
ECSS_T_FORMULA与ECSS_T_FORMULA_RESTRICT表之间有六个多对一的连接。
因此如果我们不用外连接查询,要查询一个com.ecgit.ecss.data.EcssTFormula对象就要发送1+6(com.ecgit.ecss.data.EcssTFormulaRestrict)对象连接的语句。
在Hibernate 2中我们可以在<many-to-one></many-to-one>中用outer-join=true属性。
outer-join关键字有3个值,分别是true,false,auto,默认是auto。
- true: 表示使用外连接抓取关联的内容,这里的意思是当使用load(EcssTFormula.class,“id“)时,Hibernate只生成一条SQL语句将EcssTFormula与他的连接EcssTFormulaRestrict全部初始化。
- false:表示不使用外连接抓取关联的内容,当load(EcssTFormula.class,“id“)时,Hibernate生成两条SQL语句,一条查询EcssTFormula表,另5条查询EcssTFormulaRestrict表。这样的好处是可以设置延迟加载,此处要将EcssTFormulaRestrict类设置为lazy=true。
- auto:具体是ture还是false看hibernate.cfg.xml中的配置
注意:如果使用HQL查询OrderLineItem,如 from EcssTFormulao where o.id='id',总是不使用外部抓取,及outer-join失效
这样的话我们就不能通过外连接来查询了。
那么我们可以直接在HQL语句中用 left join 来强制实现外连接查询。
java 代码
- public List findByProperty(String propertyName, Object value)
- throws SorcererException {
- log.debug("finding EcssTFormula instance with property: "
- + propertyName + ", value: " + value);
- List list = new ArrayList();
- try {
- Session session = this.getSession();
- String queryString = "from EcssTFormula as formula left join formula.ecssTFormulaRestrictByFp , formula.ecssTFormulaRestrictByFormularesultchildtype" +
- " , formula.ecssTFormulaRestrictByTp , formula.ecssTFormulaRestrictByPro , formula.ecssTFormulaRestrictByPer , formula.ecssTFormulaRestrictByCl where formula."
- + propertyName + "=:"+propertyName;
- Query queryObject = session.createQuery(queryString);
- queryObject.setParameter(propertyName, value);
- List tempList = queryObject.list();
- for(int i=0;i
- list.add(((Object[])tempList.get(i))[0]);
- }
- log.debug("size:"+list.size());
- this.closeSessionIfNecessary(session);
- } catch (RuntimeException re) {
- log.error("find by property name failed", re);
- throw new SorcererException("获得公式失败", re);
- } catch (Exception e) {
- e.printStackTrace();
- throw new SorcererException("获得公式失败", e);
- }
- return list;
- }
tempList 中存放的是一个Object数组,Object[7],Object[0]为EcssTFormula的实例,后面的六个是EcssTFormulaRestrict的实例。这样查询的语句只是一个sql语句:
sql 代码
- Hibernate: select this.FORMULAID as FORMULAID6_, this.FP as FP6_, this.FORMULARE
- SULTCHILDTYPE as FORMULAR3_6_, this.TP as TP6_, this.PRO as PRO6_, this.CL as CL
- 6_, this.PER as PER6_, this.CALCULATEID as CALCULAT8_6_, this.FORMULANAME as FOR
- MULAN9_6_, this.FORMULATYPE as FORMULA10_6_, this.FORMULARESULTTYPE as FORMULA11
- _6_, this.FORMULAPRECISION as FORMULA12_6_, this.FORMULAMARKETDATE as FORMULA13_
- 6_, this.FORMULADATETYPE as FORMULA14_6_, this.DEFAULTVALUE as DEFAULT15_6_, thi
- s.ISCALCULATE as ISCALCU16_6_, this.ISSYSTEMFORMULA as ISSYSTE17_6_, this.ISCONT
- ACTID as ISCONTA18_6_, this.FORMULACONTENT as FORMULA19_6_, this.USERCONTENT as
- USERCON20_6_, ecsstformu1_.RESTRICTID as RESTRICTID0_, ecsstformu1_.APPOINT as A
- PPOINT0_, ecsstformu1_.ISANY as ISANY0_, ecsstformu1_.EXCLUDE as EXCLUDE0_, ecss
- tformu1_.LIMITED as LIMITED0_, ecsstformu1_.ISNULL as ISNULL0_, ecsstformu2_.RES
- TRICTID as RESTRICTID1_, ecsstformu2_.APPOINT as APPOINT1_, ecsstformu2_.ISANY a
- s ISANY1_, ecsstformu2_.EXCLUDE as EXCLUDE1_, ecsstformu2_.LIMITED as LIMITED1_,
- ecsstformu2_.ISNULL as ISNULL1_, ecsstformu3_.RESTRICTID as RESTRICTID2_, ecsst
- formu3_.APPOINT as APPOINT2_, ecsstformu3_.ISANY as ISANY2_, ecsstformu3_.EXCLUD
- E as EXCLUDE2_, ecsstformu3_.LIMITED as LIMITED2_, ecsstformu3_.ISNULL as ISNULL
- 2_, ecsstformu4_.RESTRICTID as RESTRICTID3_, ecsstformu4_.APPOINT as APPOINT3_,
- ecsstformu4_.ISANY as ISANY3_, ecsstformu4_.EXCLUDE as EXCLUDE3_, ecsstformu4_.L
- IMITED as LIMITED3_, ecsstformu4_.ISNULL as ISNULL3_, ecsstformu5_.RESTRICTID as
- RESTRICTID4_, ecsstformu5_.APPOINT as APPOINT4_, ecsstformu5_.ISANY as ISANY4_,
- ecsstformu5_.EXCLUDE as EXCLUDE4_, ecsstformu5_.LIMITED as LIMITED4_, ecsstform
- u5_.ISNULL as ISNULL4_, ecsstformu6_.RESTRICTID as RESTRICTID5_, ecsstformu6_.AP
- POINT as APPOINT5_, ecsstformu6_.ISANY as ISANY5_, ecsstformu6_.EXCLUDE as EXCLU
- DE5_, ecsstformu6_.LIMITED as LIMITED5_, ecsstformu6_.ISNULL as ISNULL5_ from EC
- CM.ECSS_T_FORMULA this, ECCM.ECSS_T_FORMULA_RESTRICT ecsstformu1_, ECCM.ECSS_T_F
- ORMULA_RESTRICT ecsstformu2_, ECCM.ECSS_T_FORMULA_RESTRICT ecsstformu3_, ECCM.EC
- SS_T_FORMULA_RESTRICT ecsstformu4_, ECCM.ECSS_T_FORMULA_RESTRICT ecsstformu5_, E
- CCM.ECSS_T_FORMULA_RESTRICT ecsstformu6_ where 1=1 and this.FP=ecsstformu1_.REST
- RICTID(+) and this.FORMULARESULTCHILDTYPE=ecsstformu2_.RESTRICTID(+) and this.TP
- =ecsstformu3_.RESTRICTID(+) and this.PRO=ecsstformu4_.RESTRICTID(+) and this.CL=
- ecsstformu5_.RESTRICTID(+) and this.PER=ecsstformu6_.RESTRICTID(+)
发表评论
-
是用枚举(enum)还是用常量(const)
2008-08-18 14:33 0In prior releases, the standard ... -
将java.sql.Blob对象存储成文件
2008-07-10 18:12 4994import java.io.BufferedInputStr ... -
java中的io系统总结
2008-07-09 13:34 2250java中的io中的(input/outp ... -
为什么 Java 接口中不允许定义变量
2008-06-27 18:51 7654转自:http://www.chixiang.or ... -
Java反射机制的小尝试
2008-06-24 12:35 1221com.mycompany.reflect.Reflect类: ... -
java.sql.BatchUpdateException: Overflow Exception
2008-06-11 14:44 10859http://forum.java.sun.com/threa ... -
MyEclipse EJB 3.0 Development Overview
2008-05-21 16:21 2566My Eclipse EJB 3.0 Development ... -
使用 Spring 2.5 注释驱动的 IoC 功能
2008-04-25 22:26 0[url]使用 Spring 2.5 注释驱动的 IoC 功能 ... -
JPA Best Practices
2008-04-16 15:59 3247JPA Best Practices [1] 转自 ... -
JavaMail java.lang.NullPointerException
2008-04-16 13:14 8832使用JavaMail发送邮件出现如下的错误: [ERROR,D ... -
eclipse下快速找类
2008-04-11 14:27 1860Ctrl+Shift+T ctrl+shift+O 自动加载 ... -
response.sendRedirect(location)与rd.forward()区别
2008-03-26 12:30 67572在Java Web开发中,经 ... -
Java删除目录及目录下的所有文件
2008-03-26 12:20 30508java中删除目录事先要删除目录下的文件或子目录public ... -
fileset用法
2008-03-10 09:54 6905FileSet FileSet是一个文件组.这些文件可在 ... -
Servlet/JSP版本之间的关系
2008-01-08 15:12 2469servlet:http://java.sun.com/pro ... -
总结:Svn自动属性设置
2007-12-28 14:59 5800问题提出: 我们在用svn管理代码时候,有时候我们需要 ... -
Spring 2 AOP编程问题
2007-12-18 16:01 1499spring 的aop功能怎么不起作用。 大家帮我看看: ja ... -
Tomcat 6.0下创建虚拟目录的几种方法
2007-12-11 13:27 9626%TOMCAT_HOME%\webapps\下直接创 ... -
eclipse 设置快捷键的地方
2007-12-10 15:03 1169[Window]->[Preferences]-> ... -
Tomcat下用IE下载*.rar文件出现乱码的解决方案
2007-12-10 10:32 3322问题: 在tomcat下直接下载*.rar 一 ...
相关推荐
建立多张表,然后查询多张表的报表输出信息,得到查询的结果
如何连接2如何连接2个数据库合并2张表如何连接2个数据库合并2张表如何连接2个数据库合并2张表如何连接2个数据库合并2张表如何连接2个数据库合并2张表如何连接2个数据库合并2张表个数据库合并2张表
房地产:暨2018年年报总结:深度剖析房企三张表,大型房企增长快,小型房企杠杆低
房地产:暨2018年年报总结:深度剖析房企三张表,大型房企增长快,小型房企杠杆低.pdf
from 多张表 等于 left join 其他表.
2张表数据匹配更新
具体查询某张表的大小,相对简洁的方法实现表的查询,可以完成表的查询,非常简单简单的完成表的查询,
Oracle中比对2张表之间数据是否一致的几种方法
本文实例讲述了php+mysqli批量查询多张表数据的方法。分享给大家供大家参考。具体实现方法如下: 注意这里使用到了两个新的函数multi_query与store_result,具体代码如下: 复制代码 代码如下:<?php //1、创建...
sap 80000多张表1. rar
01 01Hibernate_Handwork : 手工配置使用Hibernate,其中详细标了Hibernate进行持久化的一些过程,因为是Hibernate的入门实例,所以注释很详细,其中有session的关闭后重建问题。 02 02Hibernate_UseMyEclipse: 利用...
比较2张表最多5对数据列数据异同 可对差异数据进行筛选
Kettle实现多张表数据的定时删除全量抽取,删除旧shuju
在实际应用中,经常需要实现在一个查询语句中显示多张表的数据,这就是所谓的多表数据记录连接查询,简称来年将诶查询。 在具体实现连接查询操作时,首先将两个或两个以上的表按照某个条件连接起来,然后再查询到...
在VC++6.0中利用Acess数据库关联多张表
本文实例讲述了MySQL 多表关联一对多查询实现取最新一条数据的方法。分享给大家供大家参考,具体如下: MySQL 多表关联一对多查询取最新的一条数据 遇到的问题 多表关联一对多查询取最新的一条数据,数据出现重复 ...
SCOTT DEPT EMP SALGRADE三张表的excel格式(xls格式),没有表结构script及insert语句,纯粹的excel数据内容
通常在项目中对表的查询都是关联多张表,多表查询就涉及到sql的内连接、外连接和自连接查询。本篇文章将简单的介绍这些sql连接的使用,希望对大家有所帮助。
sap80000多张表1.rar