Hibernate进阶学习4

深入学习hibernate的查询语句

测试HQL查询

package com.hibernate.test;

import com.hibernate.domain.Customer;
import com.hibernate.utils.HibernateUtils;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test; import java.util.List; /**
* @author: XDZY
* @date: 2018/11/16 10:26
* @description: 测试HQL语句(hibernate独有的面向对象的语法)(适合不复杂的多表查询)
*/
public class HibernateTest {
/**
* 排序查询
*/
@Test
public void test1() {
//创建Session对象
Session session = HibernateUtils.openSession();
//开启事务并获取事务对象
Transaction tx = session.beginTransaction(); /********************* 数据库操作 **********************/ //1)书写HQL语句
String hql = "from Customer order by cust_id";
//2)创建查询对象
Query query = session.createQuery(hql);
//3)执行查询
List<Customer> list = query.list(); System.out.println(list); /*******************************************************/ tx.commit();
session.close();
} /**
* 统计查询
*/
@Test
public void test2() {
//创建Session对象
Session session = HibernateUtils.openSession();
//开启事务并获取事务对象
Transaction tx = session.beginTransaction(); /********************* 数据库操作 **********************/ //1)书写HQL语句
String hql = "select count(*) from Customer";
String hql1 = "select sum(cust_id) from Customer";
String hql2 = "select avg(cust_id) from Customer";
String hql3 = "select max(cust_id) from Customer";
String hql4 = "select min(cust_id) from Customer";
//2)创建查询对象
Query query = session.createQuery(hql2);
//3)执行查询
Number number = (Number) query.uniqueResult(); System.out.println(number); /*******************************************************/ tx.commit();
session.close();
} /**
* 投影查询
*/
@Test
public void test3() {
//创建Session对象
Session session = HibernateUtils.openSession();
//开启事务并获取事务对象
Transaction tx = session.beginTransaction(); /********************* 数据库操作 **********************/ //1)书写HQL语句
String hql = "select new Customer(cust_id,cust_name) from Customer";
//2)创建查询对象
Query query = session.createQuery(hql);
//3)执行查询
List<Customer> list = query.list(); System.out.println(list); /*******************************************************/ tx.commit();
session.close();
}
}
package com.hibernate.test;

import com.hibernate.domain.Customer;
import com.hibernate.utils.HibernateUtils;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test; import java.util.Arrays;
import java.util.List; /**
* @author: XDZY
* @date: 2018/11/19 14:35
* @description: 测试HQL多表查询(hibernate独有的面向对象的语法)(适合不复杂的多表查询)
*/
public class HibernateTest2 {
/**
* 内连接
*/
@Test
public void test1() {
//创建Session对象
Session session = HibernateUtils.openSession();
//开启事务并获取事务对象
Transaction tx = session.beginTransaction(); /********************* 数据库操作 **********************/ //1)书写HQL语句
String hql = "from Customer c inner join c.linkMens";
//2)创建查询对象
Query query = session.createQuery(hql);
//3)执行查询
List<Object[]> list = query.list(); for (Object[] obj : list) {
System.out.println(Arrays.toString(obj));
} /*******************************************************/ tx.commit();
session.close();
} /**
* 迫切内连接
* 将查询到的关联的对象也封装到查询的对象中
*/
@Test
public void test2() {
//创建Session对象
Session session = HibernateUtils.openSession();
//开启事务并获取事务对象
Transaction tx = session.beginTransaction(); /********************* 数据库操作 **********************/ //1)书写HQL语句
String hql = "from Customer c inner join fetch c.linkMens";
//2)创建查询对象
Query query = session.createQuery(hql);
//3)执行查询
List<Customer> list = query.list(); System.out.println(list); /*******************************************************/ tx.commit();
session.close();
} /**
* 左(右)外连接
*/
@Test
public void test3() {
//创建Session对象
Session session = HibernateUtils.openSession();
//开启事务并获取事务对象
Transaction tx = session.beginTransaction(); /********************* 数据库操作 **********************/ //1)书写HQL语句
//String hql="from Customer c left join c.linkMens";
String hql = "from Customer c right join c.linkMens";
//2)创建查询对象
Query query = session.createQuery(hql);
//3)执行查询
List<Object[]> list = query.list(); for (Object[] obj : list) {
System.out.println(Arrays.toString(obj));
} /*******************************************************/ tx.commit();
session.close();
}
}

测试Criteria查询

package com.hibernate.test;

import com.hibernate.domain.Customer;
import com.hibernate.utils.HibernateUtils;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.*;
import org.junit.Test; import java.util.List; /**
* @author: XDZY
* @date: 2018/11/16 10:26
* @description: 测试criteria语句(hibernate独有的无语句的全面向对象的查询语法)(适合单表查询)
*/
public class HibernateTest3 {
/**
* 排序查询
*/
@Test
public void test() {
//创建Session对象
Session session = HibernateUtils.openSession();
//开启事务并获取事务对象
Transaction tx = session.beginTransaction(); /********************* 数据库操作 **********************/ Criteria criteria = session.createCriteria(Customer.class);
//criteria.addOrder(Order.asc("cust_id"));
criteria.addOrder(Order.desc("cust_id"));
List list = criteria.list();
System.out.println(list); /*******************************************************/ tx.commit();
session.close();
} /**
* 离线查询
* 就是在不创建session的情况下也能进行数据库操作(比如在service和web层调用)
*/
@Test
public void test1() {
//创建离线对象
DetachedCriteria dc = DetachedCriteria.forClass(Customer.class);
dc.add(Restrictions.idEq(3L)); //创建Session对象
Session session = HibernateUtils.openSession();
//开启事务并获取事务对象
Transaction tx = session.beginTransaction(); /********************* 数据库操作 **********************/ Criteria criteria = dc.getExecutableCriteria(session);
List list = criteria.list();
System.out.println(list); /*******************************************************/ tx.commit();
session.close();
}
}

测试类级别加载策略

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hibernate.domain">
<class name="Customer" table="cst_customer" lazy="false">
<id name="cust_id">
<generator class="native"></generator>
</id>
<property name="cust_name" column="cust_name"></property>
<property name="cust_source" column="cust_source"></property>
<property name="cust_industry" column="cust_industry"></property>
<property name="cust_level" column="cust_level"></property>
<property name="cust_linkman" column="cust_linkman"></property>
<property name="cust_phone" column="cust_phone"></property>
<property name="cust_mobile" column="cust_mobile"></property> <!-- lazy属性:决定是否延迟加载
true(默认值):延迟加载,懒加载
false:立即加载
extra:极其懒惰
fetch属性:决定加载策略,使用什么类型的sql语句加载集合数据
select(默认值):单表查询加载
join:使用多表查询加载集合
subselect:使用子查询加载集合 -->
<!-- batch-size:抓取集合的数量为3
抓取客户的集合时,一次抓取几个客户的联系人集合 -->
<set name="linkMens" batch-size="3">
<key column="lkm_cust_id"></key>
<one-to-many class="LinkMan"/>
</set>
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hibernate.domain">
<class name="LinkMan" table="cst_linkman">
<id name="lkm_id">
<generator class="native"></generator>
</id>
<property name="lkm_gender"></property>
<property name="lkm_name"></property>
<property name="lkm_phone"></property>
<property name="lkm_email"></property>
<property name="lkm_qq"></property>
<property name="lkm_mobile"></property>
<property name="lkm_memo"></property>
<property name="lkm_position"></property> <!-- fetch属性:决定加载的sql语句
select:使用单表查询
join:多表查询
lazy属性:决定加载时机
false:立即加载
proxy:由customer的类级别加载策略决定 -->
<many-to-one name="customer" column="lkm_cust_id" class="Customer" fetch="join" lazy="proxy">
</many-to-one>
</class>
</hibernate-mapping>
package com.hibernate.test;

import com.hibernate.domain.Customer;
import com.hibernate.utils.HibernateUtils;
import org.hibernate.*;
import org.junit.Test; /**
* @author: XDZY
* @date: 2018/11/16 10:26
* @description: 类级别加载策略
*/
public class HibernateTest4 {
/**
* 懒加载|延迟加载
*/
@Test
public void test() {
//创建Session对象
Session session = HibernateUtils.openSession();
//开启事务并获取事务对象
Transaction tx = session.beginTransaction(); /********************* 数据库操作 **********************/ //立即加载
//Customer customer = session.get(Customer.class, "2L"); //延迟加载:查询时只返回一个代理对象,在使用时,根据关联的session查询数据库返回结果
//为了更好的性能,建议延迟加载;延迟加载貌似只是推迟了查询
Customer customer = session.load(Customer.class, "2L");
System.out.println(customer); /*******************************************************/ tx.commit();
session.close();
}
}

测试关联级别加载策略

package com.hibernate.test;

import com.hibernate.domain.Customer;
import com.hibernate.domain.LinkMan;
import com.hibernate.utils.HibernateUtils;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test; import java.util.Set; /**
* @author: XDZY
* @date: 2018/11/16 10:26
* @description: 关联级别加载策略
*/
public class HibernateTest5 {
/**
* lazy与fetch的使用
*/
@Test
public void test() {
//创建Session对象
Session session = HibernateUtils.openSession();
//开启事务并获取事务对象
Transaction tx = session.beginTransaction(); /********************* 数据库操作 **********************/ //立即加载
Customer customer = session.get(Customer.class, "2L"); Set<LinkMan> linkMens = customer.getLinkMens();
System.out.println(linkMens.size());
System.out.println(linkMens); /*******************************************************/ tx.commit();
session.close();
}
}

Hibernate进阶学习4的更多相关文章

  1. Hibernate进阶学习3

    Hibernate进阶学习3 测试hibernate的多表关联操作(一对多,多对一,多对多) 表之间的关系主要在类与元数据配置文件中体现 package com.hibernate.domain; i ...

  2. 【SSH进阶之路】Struts + Spring + Hibernate 进阶开端(一)

    [SSH进阶之路]Struts + Spring + Hibernate 进阶开端(一) 标签: hibernatespringstrutsssh开源框架 2014-08-29 07:56 9229人 ...

  3. Hibernate基础学习2

    Hibernate基础学习2 测试hibernate的一级缓存,事务以及查询语句 1)Hibernate的一些相关概念 hibernate的一级缓存 1)缓存是为了提高该框架对数据库的查询速度 2)一 ...

  4. PHP程序员进阶学习书籍参考指南

    PHP程序员进阶学习书籍参考指南 @heiyeluren lastmodify: 2016/2/18     [初阶](基础知识及入门)   01. <PHP与MySQL程序设计(第4版)> ...

  5. Matlab 进阶学习记录

    最近在看 Faster RCNN的Matlab code,发现很多matlab技巧,在此记录: 1. conf_proposal  =  proposal_config('image_means', ...

  6. (Hibernate进阶)Hibernate系列——总结篇(九)

    这篇博文是hibernate系列的最后一篇,既然是最后一篇,我们就应该进行一下从头到尾,整体上的总结,将这个系列的内容融会贯通. 概念 Hibernate是一个对象关系映射框架,当然从分层的角度看,我 ...

  7. zuul进阶学习(二)

    1. zuul进阶学习(二) 1.1. zuul对接apollo 1.1.1. Netflix Archaius 1.1.2. 定期拉 1.2. zuul生产管理实践 1.2.1. zuul网关参考部 ...

  8. ROS进阶学习笔记(11)- Turtlebot Navigation and SLAM - ROSMapModify - ROS地图修改

    ROS进阶学习笔记(11)- Turtlebot Navigation and SLAM - 2 - MapModify地图修改 We can use gmapping model to genera ...

  9. Struts2进阶学习4

    Struts2进阶学习4 自定义拦截器的使用 核心配置文件 <?xml version="1.0" encoding="UTF-8"?> <! ...

随机推荐

  1. MATLAB矩阵求值和稀疏矩阵

    方阵的行列式: det(A) 矩阵线性无关的行数或列数,称为矩阵的秩. rank(A) 求3~20阶魔方矩阵的秩 for n=3:20 rank(magic(n)) end 矩阵的迹等于矩阵的对角线元 ...

  2. CentOS下NFS服务器配置教程

    说明: NFS服务器: 操作系统:CentOS 5.5 IP:192.168.21.160 nfs网络文件服务器共享目录:/data/osyunwei 目录所有者:www(说明:www为nginx运行 ...

  3. 如何有效防止DEDE织梦系统被挂木马安全设置(仅供参考)

    尊敬的客户,您好!     感谢广大客户对我司工作的信任和支持!      我司在最近的一个多月内陆续发现多起因 DedeCMS 安全漏洞造成网站被上传恶意脚本的事件,入侵者可利用恶意脚本对外发送大量 ...

  4. Powershell(3)

    Powershell 可以使用powershell管理的服务 share point, exchange, lync, windows azure, window server, system cen ...

  5. DNN学习笔记 最简单的皮肤制作

    说明: 在学习DNN时,使用的版本为 DNN8.参考资料:http://www.dnnsoftware.com/docs/designers/creating-themes/index.html 制作 ...

  6. python的字符串操作

    1.修改大小写 (1)title()以首字母大写的方式显示每个单词,即将每个单词的首字母都改为大写.这很有用, 因为你经常需要将名字视为信息.例如,你可能希望程序将值Ada.ADA和ada视为同一个名 ...

  7. 【起航计划 011】2015 起航计划 Android APIDemo的魔鬼步伐 10 App->Activity->Reorder Activities 后退栈 Intent FLAG

    Reorder Activities 示例有四个相关的Activitives: ReorderOnLaunch, ReorderTwo,ReorderThree, ReorderFour.其中Reor ...

  8. polyfill 一个解决兼容的绝佳方案

    polyfill为何物 Polyfill你可以理解为“腻子”,就是装修的时候,可以把缺损的地方填充抹平. 举个例子,html5的storage(session,local), 不同浏览器,不同版本,有 ...

  9. vue - 绑定css、style

    1.绑定html css1.1对象语法: 传给 v-bind:class 一个对象,以动态地切换 class <div v-bind:class="{ active: isActive ...

  10. 洛谷 P1509 找啊找啊找GF

    题目背景 "找啊找啊找GF,找到一个好GF,吃顿饭啊拉拉手,你是我的好GF.再见." "诶,别再见啊..." 七夕...七夕...七夕这个日子,对于sqybi这 ...