Hibernate中提供了5种查询方式:

  1. OID查询
  2. 对象导航查询
  3. HQL检索
  4. QBC检索
  5. SQL检索

OID检索:

Hibernate根据对象的oid(表中主键)

  • 使用get方法   Customer customer = new Customer(Customer.class , 1l);
  • 使用load方法

对象导航检索:

Hibernate根据一个已经查询到的对象,获得其关联对象的一种查询方式

LinkMan linkman = session.get(LinkMan.class , 1l);

linkman,getCustomer();

HQL检索:Hibernate Query Language

一种面向对象的查询语言,session.createQuery(hql);

  • HQL的简单查询
  • HQL的排序查询
  • HQL的条件查询
  • HQL的投影查询  : 查询对象的某个或某些属性
  • HQL的分组统计查询
  • HQL的分页查询
/**
* HQL查询方式测试类
*/
public class demo1 {
@Test
/**
* 初始化数据
*/
public void demo1() { Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
Customer customer = new Customer();
customer.setCust_name("啥几把");
for (int i = 0; i < 10; i++) {
LinkMan linkMan = new LinkMan();
linkMan.setLkm_name("啊实打" + i);
linkMan.setCustomer(customer);
;
session.save(linkMan);
}
session.save(customer);
transaction.commit();
} @Test
/**
* HQL的简单查询,sql支持*,HQL不支持*,但是聚合函数里面可以用,比如count(*)
*/
public void demo2() { Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
Query query = session.createQuery("from Customer");
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
} @Test
/**
* HQL的别名查询
*/
public void demo3() { Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
Query query = session.createQuery("select c from Customer c");
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
} @Test
/**
* HQL的排序查询,升序asc,降序desc
*/
public void demo4() { Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// HQL的排序查询
List<Customer> list = session.createQuery("from Customer order by cust_id desc ").list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
} @Test
/**
* HQL的条件查询,按位置绑定,按名称绑定
*/
public void demo5() { Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// 按位置绑定
/*
* Query query = session.
* createQuery("from Customer where cust_name like ? and cust_id = ? ");
* query.setParameter(0, "李兵"); query.setParameter(1, 1l);
*/
// 按名称绑定
Query query = session.createQuery("from Customer where cust_name like :aaa and cust_id = :bbb ");
query.setParameter("aaa", "李%");
query.setParameter("bbb", 1l);
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
} @Test
/**
* HQL的投影查询,查询对象的某个或者某些属性
*/
public void demo6() { Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// 投影查询,单个属性
// List<Object> list = session.createQuery("select c.cust_name from
// Customer c ").list();
// 投影查询,多个属性,封装到数组
/*
* List<Object[]> list =
* session.createQuery("select c.cust_name,c.cust_id from Customer c ").
* list(); for (Object[] objects : list) {
* System.out.println(Arrays.toString(objects)); }
*/
// 投影查询,多个属性,封装到对象(需要提供构造)
List<Customer> list = session.createQuery("select new Customer(cust_id,cust_name) from Customer ").list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
} @Test
/**
* HQL的分页查询
*/
public void demo7() { Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// 分页查询,单个属性
Query query = session.createQuery("from LinkMan");
query.setFirstResult(20);
query.setMaxResults(10);
List<LinkMan> list = query.list();
for (LinkMan linkMan : list) {
System.out.println(linkMan);
}
transaction.commit();
} @Test
/**
* HQL的分组统计查询,聚合函数:count(),min(),avg(),max()
*/
public void demo8() { Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// HQL的分组统计查询,得到唯一结果用uniqueResult,否则用list
/*
* Object object =
* session.createQuery("select count(*) from LinkMan").uniqueResult();
* System.out.println(object);
*/
// 分组统计:按来源,且统计大于1的
List<Object[]> list = session
.createQuery("select cust_source,count(*) from Customer group by cust_source having count(*) > 1")
.list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
} transaction.commit(); }
}

QBC查询:

Query By Criteria:条件查询,更加面向对象的查询方式,并不是所有方式都能用

  • 简单查询
  • 排序查询
  • 分页查询
  • 条件查询
  • 统计查询
  • 离线条件查询  DetachedCriteria(SSH整合经常用到这个模版),离线:脱离Session使用,适合条件多的查询,免于拼接JDBC语句

/**
*QBC查询
*/
public class HibernateDemo2 {
@Test
/**
* 简单查询
*/
public void demo1(){
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
Criteria criteria = session.createCriteria(Customer.class);
List<Customer> list = criteria.list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
} @Test
/**
* 排序查询
*/
public void demo2(){
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
Criteria criteria = session.createCriteria(Customer.class);
criteria.addOrder(Order.desc("cust_id"));
List<Customer> list = criteria.list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
} @Test
/**
* 分页查询
*/
public void demo3(){
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
Criteria criteria = session.createCriteria(LinkMan.class);
criteria.setFirstResult(10);
criteria.setMaxResults(5);
List<LinkMan> list = criteria.list();
for (LinkMan linkMan : list) {
System.out.println(linkMan);
}
transaction.commit();
}
@Test
/**
* 条件查询
*/
public void demo4(){
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
Criteria criteria = session.createCriteria(Customer.class);
/**
* 设置条件:
* = eq
* > gt
* >= gq
* < lt
* <= le
* <> ne
* like
* in
* and
* or
*/
criteria.add(Restrictions.eq("cust_source", "小广告"));
criteria.add(Restrictions.like("cust_name", "李%"));
List<Customer> list = criteria.list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
}
@Test
/**
* 条件查询
*/
public void demo5(){
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
Criteria criteria = session.createCriteria(Customer.class);
/**
* 设置条件:
* = eq
* > gt
* >= gq
* < lt
* <= le
* <> ne
* like
* in
* and
* or
*/
criteria.add(Restrictions.eq("cust_source", "小广告"));
criteria.add(Restrictions.like("cust_name", "李%"));
List<Customer> list = criteria.list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
} @Test
/**
* 统计查询
*/
public void demo6(){
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
Criteria criteria = session.createCriteria(Customer.class);
/*
* add 普通条件,where后面的
* addOrder :排序
* setProjection :聚合函数,group by having
*/
criteria.setProjection(Projections.rowCount());
Long num = (Long) criteria.uniqueResult();
System.out.println(num);
transaction.commit();
}
@Test
/**
* 离线条件查询
*/
public void demo7(){
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class);
detachedCriteria.add(Restrictions.like("cust_name", "李%")); Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction(); Criteria criteria = detachedCriteria.getExecutableCriteria(session); List<Customer> list = criteria.list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
} }

多表查询:

SQL的多表查询:

连接查询:

交叉链接:得到笛卡尔乘积,不常用。select * from t1 , t2;

内链接: Inner Join(Inner 可以省略,看到Join则是内连接,查到的是两个表公共的部分,交集)

  • 隐式内连接(看不到Inner Join,但是和InnerJoin查到的结果一样)  select * from t1 , t2 where t1.id = t2.id;
  • 显式内连接(能看到Inner Join)    select * from t1 inner join t2 on t1.id = t2.id;

外链接:左表以及两表公共部分,左表的数据全都查询出来。或者右表。

  • 左外连接(left outer join outer可以省略)SELECT * FROM cst_customer c1 LEFT OUTER JOIN  cst_linkman c2 ON c1.cust_id = c2.lkm_cust_id;
  • 右外连接

HQL多表查询:

连接查询:

交叉链接:得到笛卡尔乘积,不常用。select * from t1 , t2;

内链接: Inner Join(Inner 可以省略,看到Join则是内连接,查到的是两个表公共的部分,交集)

  • 隐式内连接(看不到Inner Join,但是和InnerJoin查到的结果一样)  select * from t1 , t2 where t1.id = t2.id;
  • 显式内连接(能看到Inner Join)    session.createQuery("from Customer c inner join c.linkMans")
  • 迫切内连接:HQL迫切内连接:session.createQuery("select distinct c from Customer c inner join fetch c.linkMans") fetch:通知Hibernate把后面对象装到前面对象的集合里

外链接:左表以及两表公共部分,左表的数据全都查询出来。或者右表。

  • 左外连接
  • 迫切左外连接:
  • 右外连接
    @Test
/**
* HQL的多表查询
*/
public void demo9() { Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
/* //HQL普通内连接
List<Object[]> list = session.createQuery("from Customer c inner join c.linkMans").list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}*/
//HQL迫切内连接:在普通内连接后面添加一个关键字fetch
List<Customer> list = session.createQuery("select distinct c from Customer c inner join fetch c.linkMans").list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
}

SQL查询:

    @Test
/**
* SQL查询
*/
public void demo1() { Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
SQLQuery query = session.createSQLQuery("select * from cst_customer");
/*List<Object[]> list = query.list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}*/
//封装到实体
query.addEntity(Customer.class);
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
}

七 Hibernate5种查询检索方式,单表&多表的更多相关文章

  1. Dynamic CRM 2013学习笔记(十)客户端几种查询数据方式比较

    我们经常要在客户端进行数据查询,下面分别比较常用的几种查询方式:XMLHttpRequest, SDK.JQuery, SDK.Rest. XMLHttpRequest是最基本的调用方式,JQuery ...

  2. 04_Hibernate检索方式

    一.Hibernate检索方式概述 OID检索方式:按照对象的OID来检索对象(get/load) HQL检索方式:使用面向对象的HQL查询语言 QBC检索方式:使用QBC(Query By Crit ...

  3. SNF快速开发平台MVC-各种级联绑定方式,演示样例程序(包含表单和表格控件)

    做了这么多项目,经常会使用到级联.联动的情况. 如:省.市.县.区.一级分类.二级分类.三级分类.仓库.货位. 方式:有表单需要做级联的,还是表格行上需要做级联操作的. 实现:实现方法也有很多种方式. ...

  4. mysq表的三种关系,数据的增删改以及单表多表查询

    一丶三种关系 分析步骤: #.先站在左表的角度去找 是否左表的多条记录可以对应右表的一条记录,如果是,则证明左表的一个字段foreign key 右表一个字段(通常是id) #.再站在右表的角度去找 ...

  5. springdata 查询思路:基本的单表查询方法(id,sort) ---->较复杂的单表查询(注解方式,原生sql)--->实现继承类---->复杂的多表联合查询 onetomany

    springdata 查询思路:基本的单表查询方法(id,sort) ---->较复杂的单表查询(注解方式,原生sql)--->实现继承类---->复杂的多表联合查询 onetoma ...

  6. ORACLE表与表联接的几种方式

    三大表与表联接方式 1.NESTED LOOPS 嵌套循环 2.HASH JOIN 哈希联接 3.SORT MERGE 排序合并联接 1.NESTED LOOPS  嵌套循环 嵌套循环的本质是将外部数 ...

  7. hibernate(七) hibernate中查询方式详解

    序言 之前对hibernate中的查询总是搞混淆,不明白里面具体有哪些东西.就是因为缺少总结.在看这篇文章之前,你应该知道的是数据库的一些查询操作,多表查询等,如果不明白,可以先去看一下 MySQL数 ...

  8. [原创]java WEB学习笔记89:Hibernate学习之路-- -Hibernate检索方式(5种),HQL介绍,实现功能,实现步骤,

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  9. java框架之Hibernate(4)-几种检索方式

    准备 模型及映射文件 package com.zze.bean; import java.util.HashSet; import java.util.Set; public class Class ...

随机推荐

  1. 重新梳理IT知识之java-01语法(一)

    标识符的命名规范 包名:xxxyyyzzz 类名.接口名:XxxYyyZzz (大驼峰) 变量名.方法名:xxxYyyZzz 常量名:XXX_YYY_ZZZ //**************强制类型转 ...

  2. java里判断字符串是否为数字类型的方法

    String type = "数字类型";if(StringUtils.isNotBlank(value)){ //区分正负数 if(value.startsWith(" ...

  3. 通过LAMP部署phpMyAdmin、wordpress(https)、discuz

    1.安装启动LAMP 安装环境: CentOS Linux release 7.5.1804 安装包: # yum -y install httpd php php-mysql mariadb-ser ...

  4. 一个高级PHP工程师所应该具备的(转自元如枫博客)

    初次接触PHP,就为他的美所折服,于是一发不可收拾. 很多面试,很多人员能力要求都有“PHP高级工程师的字眼”,如果您真心喜欢PHP,并且您刚起步,那么我简单说说一个PHP高级工程师所应该具备的,希望 ...

  5. (0)Lora及LoraWAN

    Lora和LoraWAN的区别 LoRa经常被误用来描述整个LPWAN通信系统,其实Lora是Semtech拥有的专有调制格式. SX1272和SX1276 LoRa芯片使用称为chirp扩频(CSS ...

  6. vue.js 第八课

    列表渲染 v-for template v-for 数组变动检查 变异方法 替换数组 track-by track-by $index 问题 对象 v-for 值域 v-for 显示过滤/排序的结果 ...

  7. Java入门笔记 02-数组

    介绍: Java的数组既可以存储基本类型的数据,也可以存储引用类型的数据,但是要求所有的数组元素具有相同的数据类型.另外,Java数组也是一种数据类型,其本身就是一种引用类型. 一.数组的定义: 数据 ...

  8. Mysql 分组查询出现'this is incompatible with sql_mode=only_full_group_by'的解决办法

    由于Mysql自动开启了 only_full_group_by,所以若查询的字段不在group by里面,则分组报错. 解决办法其一:mysql配置,关闭only_full_group_by,这种办法 ...

  9. selenium webdriver 操作RadioButton

    @Test public void testRadio() { WebDriver driver = ExplorerBase.IESetting(); try { Thread.sleep(500) ...

  10. WebService-CXF 学习笔记

    什么是CXF Apache CXF = Celtix + Xfire支持多种协议:SOAP1.1,1.2XML/HTTPCORBA(Common Object Request Broker Archi ...