Hibernate的查询方法(五种)

一、OID查询:按主键查询

--get( )

--load( )

二、对象导航查询:通过已经查询到的联系人,得到起关联的对象

三、SQL查询

四、HQL查询(***)

1、String hql = “ 查询语句”

Query query = session.createQuery( ) ; // 得到query对象

(1)简单查询

hql = “from Customer”;//查询Customer所有信息

List<Customer> list = query.list( ) ;//得到一个List集合,通过遍历即可

(2)排序查询:默认升序

hql = “from Customer order by 属性名 ASC(升)/DESC(降序)”

List<Customer> list = query.list( ) ;//得到一个List集合,通过遍历即可

(3)条件查询

a、hql = “form Customer where 属性名= ?(and/or ,,,,,,)”

query.setParameter(0 , 属性值):0表示第一个问号

b、名称绑定

hql = “form Customer where 属性名=  : a(and/or ,,,,,,)”(冒号 + 名称(任意))

query.setParameter(a , 属性值):a表示名称

(4)投影查询:查询特定的属性

例如:查询所有客户的名称

a、使用别名.属性,返回一个类型为Object的集合

hql = “select c.cust_name(,c.cust_source可以多个) from Customer c”

List<Object> list = query.list( ) ;//得到一个List集合,通过遍历即可,Object更通用

b、使用构造函数,在持久化类中创建一个构造函数,返回值类型为Customer

hql = “ select new Customer(cust_name, cust_source) from Customer”

List<Customer> list = query.list( ) ;//得到一个List集合,通过遍历即可

(5)分页查询

query.setFirstResult( 0)  :  表数据的第1 行开始

query.setMaxResult( 0)  :  每一页共10 行

(6)分组查询:

用聚合函数:count( ) max( ) min( )  结合 group by

select 属性名,count(*) from Customer group by 属性名

(7)HQL的多表查询

SQL的多表查询

    连接查询:交叉连接:笛卡尔积

      -select * from A,B;

    内连接     :inner join (inner 可以省略)

      -隐式内连接:

        select * from A,B where A.id = B.aid;

      -显示内连接:

        select * from A inner join B on A.id = B.aid;

    外连接     :

      -左外连接:left outer join(outer 可以省略)

          select * from A left outer join B on A.id= B.aid;

      -右外连接:right outer join(outer 可以省略)

          select * from A right outer join B on A.id = B.aid;

HQL的多表查询

     内连接

        显示内连接

        隐式内连接

        迫切内连接

      外连接

        左外连接

        右外连接

        迫切左外连接

五、QBC查询:Query By Criteria(完全面向对象查询)

1、得到一个Criteria 对象

Criteria c = session.createCriteria(Customer.class)

2、查询所有   c.list( )

3、排序查询   c.addOrder(order.asc/desc( 属性名))

4、分页查询   c.setFirstResult( 0)  :  表数据的第1 行开始

c.setMaxResult( 0)  :  每一页共10 行

5、条件查询

c.add(Restriction.eq(属性名,属性值)):查询名=值

  eq  =         and

  gt  >               like

  ge  >=            or

  lt   <

  le   <=

  需要多添加查询就在add( )

6、离散条件查询(DetachedCriteria): 隔离session的查询

  DetachedCriteria dc = DetachedCriteria.forClass(Customer.class);

  设置条件

   dc. add(Restriction.eq(属性名,属性值))

Hibernate的抓取策略(优化)

1、什么是延迟加载

  延迟加载:lazy(懒加载)。执行到该行代码的时候,不会发送语句去进行查询,在真正使用这个对象的属性的时候才会发送SQL语句进行查询。

2、延迟加载的分类

(1)类级别的延迟加载: 指的是通过load方法查询某个对象的时候,是否采用延迟。session.load(Customer.class,1l);

  类级别延迟加载通过<class>上的lazy进行配置

  如果让lazy失效,

   -- 将lazy设置为false

   -- 将持久化类使用final修饰

   -- Hibernate. Initialize()

(2)关联级别的延迟加载:指的是在查询到某个对象的时候,查询其关联的对象的时候,是否采用延迟加载。

    Customer customer = session.get(Customer.class,1l);

    customer.getLinkMans();----通过客户获得联系人的时候,联系人对象是否采用了延迟加载,称为是关联级别的延迟。

      抓取策略往往会和关联级别的延迟加载一起使用,优化语句。

3   抓取策略的概述

  通过一个对象抓取到关联对象需要发送SQL语句,SQL语句如何发送,发送成什么样格式通过策略进行配置。通过<set>或者<many-to-one>上

  通过fetch属性进行设置 fetch和这些标签上的lazy如何设置优化发送的SQL语句

3.1   <set>上的fetch和lazy

fetch:抓取策略,控制SQL语句格式

--select               :默认值,发送普通的select语句,查询关联对象

--join                    :发送一条迫切左外连接查询关联对象

--subselect           :发送一条子查询查询其关联对象

lazy:延迟加载,控制查询关联对象的时候是否采用延迟

  --- true                 :默认值,查询关联对象的时候,采用延迟加载

  ---false                 :查询关联对象的时候,不采用延迟加载

  ---extra                 :极其懒惰。

在实际开发中,一般都采用默认值。如果有特殊的需求,可能需要配置join

3.2   <many-to-one>上的fetch和lazy

fetch :抓取策略,控制SQL语句格式。

  --select        :默认值,发送普通的select语句,查询关联对象。

  --join            :发送一条迫切左外连接。

lazy    :延迟加载,控制查询关联对象的时候是否采用延迟。

  --proxy        :默认值,proxy具体的取值,取决于另一端的<class>上的lazy的值。

  --false          :查询关联对象,不采用延迟。

  --no-proxy  :(不会使用)

在实际开发中,一般都采用默认值。如果有特殊的需求,可能需要配置join

4、 批量抓取

    4.1什么是批量抓取?指一批关联对象一起抓取,batch-size

Hibernate学习(三)的更多相关文章

  1. hibernate学习三(使用Annotation,注解)

    一.新建一个工程hibernate_02_HelloWorld_Annotation(复制01工程并重命名); 二.新建一个实体类teacher.java,数据库中新建teacher表; import ...

  2. hibernate学习(三) hibernate中的对象状态

    hibernate对象的状态分为三种:  游离状态,持久化状态,瞬时状态 下面一行代码区分: Configuration   cfg=new Configuration().configure(); ...

  3. Hibernate学习(三)自动建表

    一般情况下有如下两种方法: 1.在配置文件中添加如下配置 <property name="hibernate.hbm2ddl.auto">create</prop ...

  4. Hibernate学习三----------session详解

    © 版权声明:本文为博主原创文章,转载请注明出处 如何获取session对象 1. openSession 2. getCurrentSession - 如果使用getCurrentSession需要 ...

  5. hibernate学习三 精解Hibernate之核心文件

    一 hibernate.cfg.xml详解 1 JDBC连接: 2 配置C3P0连接池: 3 配置JNDI数据源: 4 可选的配置属性: 5 hibernate二级缓存属性 6 hibernate事务 ...

  6. Hibernate学习2--对象的三种状态以及映射关系的简单配置

    上篇hibernate的博客总体简单梳理了对象持久化的一些思想以及hibernate中对象持久化化的方法,下面说说对象持久化过程的三种状态. 一.hibernate缓存的概念 1.session与缓存 ...

  7. Hibernate学习之——搭建log4j日志环境

    昨天讲了Hibernate开发环境的搭建以及实现一个Hibernate的基础示例,但是你会发现运行输出只有sql语句,很多输出信息都看不见.这是因为用到的是slf4j-nop-1.6.1.jar的实现 ...

  8. Hibernate学习笔记(二)

    2016/4/22 23:19:44 Hibernate学习笔记(二) 1.1 Hibernate的持久化类状态 1.1.1 Hibernate的持久化类状态 持久化:就是一个实体类与数据库表建立了映 ...

  9. [原创]java WEB学习笔记88:Hibernate学习之路-- -Hibernate检索策略(立即检索,延迟检索,迫切左外连接检索)

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

  10. [原创]java WEB学习笔记87:Hibernate学习之路-- -映射 继承关系(subclass , joined-subclass,union-subclass )

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

随机推荐

  1. JAVA后端生成Token(令牌),用于校验客户端,防止重复提交

    转:https://blog.csdn.net/u011821334/article/details/79390980 转:https://blog.csdn.net/joshua1830/artic ...

  2. 使用property为类中的数据添加行为

    对于面向对象编程特别重要的是,关注行为和数据的分离. 在这之前,先来讨论一些“坏”的面向对象理论,这些都告诉我们绝不要直接访问属性(如Java): class Color: def __init__( ...

  3. Ipython Notebook ipynb文件转化为Python脚本

    欢迎关注博主主页,学习python视频资源 方法1. pycharm可以打开 方法2 https://jingyan.baidu.com/article/19192ad8edc736e53e57072 ...

  4. maven_eclipse配置maven

    1.eclipse配置3.3.9版本的maven 2.修改仓库位置

  5. SpringBoot笔记十一:html通过Ajax获取后端数据

    我们知道在Java Web中,前端的JSP可以使用EL表达式来获取Servlet传过来的数据Spring Boot中也有Thymeleaf模板可以使用th: text="${XXX}&quo ...

  6. linux环境下遇到的所有问题

    启动redis # 进去到src目录下,指定配置文件启动 ./redis-server ../redis.conf 设置外网访问 更改redis.conf 文件 bind 127.0.0.1 prot ...

  7. mysql使用navicat和mysqldump导出数据

    1.navicat 方式一:选中表,右键转储:(含有表结构和数据) 方式二:选择右上角工具,点击数据传输,在这个页面右侧选择数据库,左侧选择文件. 点击下一步,选择导出的表名和各种函数什么的,然后点击 ...

  8. js方法参数中含有单引号双引号的处理

    最近在做项目时,遇到一个问题.当在js脚本中,拼接生成一个tr,然后添加到一个表格里. //假定testval是从后台传过来的数据 var testval = "含有'半角单引号的字符串&q ...

  9. HTML第五耍 表格标签

    HTML标记语言中可以使用table标签创建表格. 表格由 <table> 标签来定义.每个表格均有若干行(由 <tr> 标签定义),字母 tr 指表格数据(table row ...

  10. MysqL_select for update锁详解

    先来举一个在某些应用场景下会出现数据不一致的例子,当然存储引擎是InnoDB(至于为什么,后面再告诉你). 电商平台常见的下单场景: 一般商品表(goods)有基本的四个字段,id(主键),goods ...