代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
Java
】
Hibernate显示连接,隐式连接,预抓取
作者:
/ 发布于
2016/11/21
/
527
public static void main(String[] args) { testHibernateJoin(); Company company = testJoinFetch(); System.out.println(company.getShortName()); } /** * Hibernate隐式连接:不适用join关键字,使用英文点号来隐式连接关联实体,而Hibernate底层将西东进行关联查询 * Hibernate显示连接:需要使用join关键字,可以使用with关键字(相当于sql语句中的on关键字)来提供额外的连接条件 * 显示连接与隐式连接的区别: * 1、隐式连接底层将转换为sql92的内连接,显示连接将转换为sql99的多表连接 * 2、隐式连接和显示连接的返回结果不同。 * 使用隐式连接查询返回的是多个被查询实体组成的集合。如下面的例子中,只选择了company表中的数据列,所以查询的结果是company对象组成的集合。 * 使用显示连接查询返回的结果也是集合,但集合元素是被查询持久化对象,所有被关联的持久化对象所组成的数组。 * 隐式连接的sql语句输出: * select accidentme0_.ID as ID1_, accidentme0_.COMPANY_ID as COMPANY2_1_, accidentme0_.YEAR as YEAR1_, accidentme0_.PROJECT as PROJECT1_, accidentme0_.CONTENT as CONTENT1_, accidentme0_.COMPLETE_DATE_PLAN as COMPLETE6_1_, accidentme0_.COMPLETE_DATE_ACTUAL as COMPLETE7_1_, accidentme0_.IS_COMPLETE as IS8_1_ from ACCIDENT_MEASURE accidentme0_ where accidentme0_.COMPANY_ID>36 显示连接的sql语句输出: select accidentme0_.ID as ID1_0_, company1_.ID as ID0_1_, accidentme0_.COMPANY_ID as COMPANY2_1_0_, accidentme0_.YEAR as YEAR1_0_, accidentme0_.PROJECT as PROJECT1_0_, accidentme0_.CONTENT as CONTENT1_0_, accidentme0_.COMPLETE_DATE_PLAN as COMPLETE6_1_0_, accidentme0_.COMPLETE_DATE_ACTUAL as COMPLETE7_1_0_, accidentme0_.IS_COMPLETE as IS8_1_0_, company1_.NAME as NAME0_1_, company1_.TYPE as TYPE0_1_, company1_.REMARK as REMARK0_1_, company1_.SHORT_NAME as SHORT5_0_1_ from ACCIDENT_MEASURE accidentme0_ inner join COMPANY company1_ on accidentme0_.COMPANY_ID=company1_.ID where company1_.ID>36 如何应用显示连接和隐式连接: 如果关联实体是单个实体或者单个的组件属性,hql依然可以使用英文点号来隐式连接关联实体或组件; 但如果关联实体是集合(包括1对N关联、N对N关联和集合元素是组件等),则必须使用join来显示连接关联实体和组件。 对于有集合属性的,Hibernate默认采用延迟加载策略。可以在映射文件中指定lazy="false"来关闭延迟加载 */ public static void testHibernateJoin(){ Configuration cfg = new Configuration().configure(); SessionFactory factory = cfg.buildSessionFactory(); Session session = factory.openSession(); Transaction transaction = session.beginTransaction(); //隐式连接测试 String hql = "from AccidentMeasure am where am.company.id > 36"; Query query = session.createQuery(hql); List list = query.list(); System.out.println(list.size()); //显示连接测试,返回的是对象的数组的集合 hql = "from AccidentMeasure am inner join am.company com where com.id > 36"; query = session.createQuery(hql); list = query.list(); Object[] objects = (Object[]) list.get(0); Company company = (Company) objects[1]; AccidentMeasure measure = (AccidentMeasure)objects[0]; System.out.println(company.getName()); System.out.println(measure.getContent()); System.out.println(list.size()); //显示连接测试,返回的是所需对象的集合 hql = "select distinct am from AccidentMeasure am inner join am.company com where com.id > 36"; query = session.createQuery(hql); list = query.list(); System.out.println(list.size()); transaction.commit(); session.close(); } /** * fetch关键字将导致hibernate在初始化AccidentMeasure对象时,同时抓取该AccidentMeasure关联的Company属性。 * 使用join fetch时通常无需指定别名,因为相关联的对象不应当在where子句中使用。而且,被关联的对象也不会在被查询 * 的结果中直接返回。而是应该通过其父对象来访问。 * 使用fetch关键字应注意: * 1、fetch不应与setMaxResults,setFirstResult公用。因为这些操作是基于结果集的,而在预先抓取集合类时可能包含重复的数据,无法预知精确的行数 * 2、fetch不能与独立的with条件一起使用 * 3、如果再一次查询中fetch多个集合,可以返回笛卡尔积 */ public static Company testJoinFetch(){ Configuration cfg = new Configuration().configure(); SessionFactory factory = cfg.buildSessionFactory(); Session session = factory.openSession(); Transaction transaction = session.beginTransaction(); String hql = "from AccidentMeasure am join fetch am.company"; Query query = session.createQuery(hql); List list = query.list(); transaction.commit(); session.close(); AccidentMeasure measure = (AccidentMeasure) list.get(0); System.out.println(measure.getCompany().getId()); return measure.getCompany(); }
试试其它关键字
同语言下
.
List 切割成几份 工具类
.
一行一行读取txt的内容
.
Java PDF转换成图片并输出给前台展示
.
java 多线程框架
.
double类型如果小数点后为零则显示整数否则保留两位小
.
将图片转换为Base64字符串公共类抽取
.
sqlParser 处理SQL(增删改查) 替换schema 用于多租户
.
JAVA 月份中的第几周处理 1-7属于第一周 依次类推 29-
.
java计算两个经纬度之间的距离
.
输入时间参数计算年龄
可能有用的
.
List 切割成几份 工具类
.
一行一行读取txt的内容
.
Java PDF转换成图片并输出给前台展示
.
java 多线程框架
.
double类型如果小数点后为零则显示整数否则保留两位小
.
将图片转换为Base64字符串公共类抽取
.
sqlParser 处理SQL(增删改查) 替换schema 用于多租户
.
JAVA 月份中的第几周处理 1-7属于第一周 依次类推 29-
.
java计算两个经纬度之间的距离
.
输入时间参数计算年龄
贡献的其它代码
Label
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3