2019独角兽企业重金招聘Python工程师标准>>>

主要由三种查询:HQL查询、Criteria条件查询、SQL查询。

以下分别讲解

1. HQL查询

HQL(Hibernate Query Language)查询提供了更加丰富和灵活的查询特性,因此Hibernate将HQL查询立为官方推荐的标准查询方式。

HQL语法与SQL相似,但HQL是一种面向对象的查询语言,操作的是类、实例和属性等。

HQL是完全面向对象的查询语言,支持继承和多态等特性。

HQL查询步骤

(1) 获得Hibernate Session对象

(2) 设计HQL查询语句

(3) 以HQL查询语句作为参数,调用Session.createQuery(hql)方法创建查询对象

(4) 如果HQL查询语句包含参数,调用Query的setXxxx()方法为参数赋值

(5) 调用Query对象的list等方法遍历查询结果

public class HqlQueryTest{  private void findStudents(){SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();Session session = sessionFactory.openSession();Transaction trans = session.beginTransaction();Query query = session.createQuery("FROM Student as stu WHERE stu.studentid=:sid");query.setString("sid", "123456");List list = query.list();for...trans.commit();session.close();sessionFactory.close();}
}

Query接口提供了绑定各种Hibernate映射类型的方法,

如:setBinary()/setString()/setBoolean()/setByte()/setCalendar()/setCharacter()/setDate()/setDouble()/setText()/setTime()/setTimestamp()。

还包含了两个用于实现Hibernate分页的方法:

① setFirstResult(int firstResult):设置返回的结果集从第几条记录开始;

② setMaxResults(int maxResults):设置本次查询返回的结果数;

HQL语法分析

HQL语句本身不区分大小写,但HQL中使用的包名、类型、实例名及属性名都区分大小写。

(1) FROM子句

from Student as st

该子句返回Student持久化类的所有实例,通常推荐起别名;

(2) SELECT子句

select子句选择将哪些对象与属性返回到查询结果集中,当然选择的属性必须是from后持久化类包含的属性。如:

SELECT st.name FROM Student as st

select可以选择任意属性,不仅可以选择持久化类的直接属性,还可以选择引用属性包含的属性(关联内容)。如:

SELECT st.class FROM Student as st

(3) 聚集函数

HQL查询甚至可以返回作用与属性之上的聚集函数的计算结果,HQL支持的聚集函数与SQL完全相同。有5种:

① avg:计算属性平均值;

② count:统计选择对象的数量;

③ max:统计属性值的最大值;

④ min:统计属性值的最小值;

⑤ sum:计算属性值的总和;

如:

SELECT count(*) FROM Student

SELECT max(st.age) FROM Student as st

(4) 多态查询

HQL语句被设计成能理解多态查询,Hibernate可以在from子句中指定任何Java类或接口,其from后跟的持久化类名不仅会查询出该持久化类的全部实力,还会查询出该类中子类的全部实例。

如:FROM Student as st    //该查询语句不仅会查询出Student的全部实例,还会查询出Student的子类

(5) WHERE子句

where子句用于筛选选中的结果,以缩小选择的范围。

如: FROM Student as st WHERE st.name LIKE “张%”

where子句中的属性表达式必须以基本类型或java.lang.String结尾,不要使用引用类型属性结尾。

如Student有class属性,class有classname属性:

FROM Student as st WHERE st.class.Classname LIKE “td%”  //正确

FROM Student as st WHERE st.class LIKE “td%”                   //不正确

(6) 表达式

HQL的表达式非常多,其where子句后支持的运算符也很多,不仅包括SQL的运算符,也包括EJB-QL的运算符等。

在where子句中允许使用的表达式包括大多数可以在SQL中使用的表达式。

· 数学运算符: + 、-、*、/  等

· 二进制比较运算符: =、<=、>=、<>、!=、like 等

· 逻辑运算符:and、or、not 等

· 判断字:in、not in、between、is null、is not null、is empty、is not empty、memberof、not memberof 等

· 条件判断:case、case…when…then…else…end 等

· 字符串连接符:value1 || value2或使用函数 concat(value1, value2)

· 时间操作函数:currentDate、currentTime、currentTimestamp、second、minute、hour、day、month、year 等

· HQL还支持EJB-QL3.0所支持的函数或操作substring、trim、lower、upper、Length、locate、abs、sqrt、bit_length和nullif 等

· 支持数据库的类型转换函数,如cast(…as….),第二个参数是Hibernate的类型名,或者extract(…from…),前提是底层数据库支持ANSI cast和extract

· 如果底层数据库支持单行函数sign、trunk、rtrim()、sin,则HQL语句也可以完全支持

· HQL语句支持使用“?”作为参数占位符,这与JDBC的参数占位符一致,也可以使用命名参数展位符号,方法是在参数名前加冒号“:”,如 :username、:xxx等

· 可在where子句中使用SQL常量,如“tfnew21”、66、”2009-04-21”等

· 还可以在HQL语句中使用Java public static final常量,如CC.Color.TABBY

在这些结构变量中:size、elements、ndices、minindex、maxindex、minelement、maxelement等只能在where子句中使用。

where子句中,有序集合的元素(arrays、lists、maps)可以通过“[]”运算符访问。用法如下:

FROM Student as st where st.class[0].classname is not null

group by子句返回聚集值(Aggregate Values)的查询可以按照一个返回的类或组件(Components)中的任何属性(Property)进行分组,可以对持久化类或引用属性的属性进行分组,分组时可使用group by子句。如下:

SELECT st.age, count(st.name) FROM Student as st GROUP BY st.age

类似于SQL的规则,出现在select后的属性要么出现在聚集函数中,要么出现在group by的属性列表中。

having子句用于对分组进行过滤,having子句只能在有group by子句时才可以使用。如:

SELECT st.age, count(st.name) FROM Student as st GROUP BY st.age HAVING st.age BETWEEN 21 AND 25;

根据查询返回的列表(list),可以按照一个返回的类或组件中的任何属性用order by子句进行排序

可以使用ASC(升序)、DESC(降序)指定排序规则,没有指定则默认采用升序规则。如:

FROM Student as st ORDER BY st.age DESC

group by和order by子句中都不能包含算数表达式

对于集合属性,Hibernate默认采用延迟加载策略

例如,对于持久化类Student,有集合属性class,加载Student实例时,默认不加载class属性。如果Session被关闭,则Student实例将无法访问关联的class属性。

为了解决该问题,可以在Hibernate映射文件中取消延迟加载,或者使用fetch jion。如:

FROM Student as st FETCH JOIN st.class    //此处的fetch语句将会初始化Student的class集合属性

如果使用了属性级别的延迟加载,可以用fetch all properties来强制Hibernate立即获取那些原本需要延迟加载的属性。如:

FROM Student FETCH ALL PROPERTIES WHERE age>12 ORDER BY age

HQL查询还支持查询所用的HQL语句放入配置文件中,而不是代码中。通过这种方式,可以大大提高程序设计的灵活度。如下:

<query name="getStudent”>

FROM Student FETCH ALL PROPERTIES WHERE age>? ORDER BY age

</query>

在程序中调用命名查询的方法为:

Query query = session.getNamedQuery(“getStudent”);

query.setInteger(0, 21);

2. Creteria条件查询

条件查询是更具面向对象特色的数据查询方式,通过以下三个类完成:

· Creteria:代表一次查询

· Criterion:代表一个查询条件

· Restrictions:产生查询条件的工具类

执行条件查询的步骤:

(1) 获得Hibernate的Session对象

(2) 以Session对象创建Criteria对象

(3) 增加Criterion查询条件

(4) 执行Criteria的list等方法返回结果集

如:

//增加的限制条件必须是Student已经存在的属性

Criteria cri = session.createCriteria(Student.class);

cri.add(Restrictions.gt(“studentid”, new Integer(123)));

List list = cri.list();

在条件查询中,Criteria接口代表一次查询,该查询本身不具备任何的数据筛选功能。

调用createCriteria(Class class)方法对某个持久化类创建条件查询实例。

Criteria常用方法

Criteria add(Criterion criterion):增加查询条件;

Criteria addOrder(Order order):增加排序规则;

List list():返回结果集;

分页查询用的两个方法

Criteria setFirstResult(int firstResult):设置查询返回的第一行记录;

Criteria setMaxResult(int maxResult):设置查询返回的记录数;

Criterion接口代表一个查询条件,该查询条件由Restrictions负责产生,而Restrictions是专门用于产生查询条件的工具类,它的方法大部分都是静态方法。

常用的方法有如下几种:

static Criterion allEq(Map propertyNameValues):判断指定属性(由Map参数的key指定)和指定值(由Map参数的value指定)是否完全相等;

static Criterion between(String propertyName, Object obj1, Object obj2):判断属性值是否在某个值范围之内;

static Criterion ilike(String propertyName, Object value):判断属性值是否匹配某个字符串;

static Criterion ilike(String propertyName, String value, MatchMode matchMode):判断属性值是否匹配某个字符串,并确定匹配模式;

static Criterion in(String propertyName, Collection values):判断属性值是否在某个集合内;

static Criterion in(String propertyName, Object[] values):判断属性值是否数组元素的其中之一;

static Criterion isEmpty(String propertyName):判断属性值是否为空;

static Criterion isNotEmpty(String propertyName):判断属性值是否不为空;

static Criterion isNull(String propertyName):判断属性值是否不为空;

static Criterion isNotNull(String propertyName):判断属性值是否不为空;

static Criterion not(Criterion expression):对Criterion求否;

static Criterion sizeEq(String propertyName, int size):判断某个属性的元素个数是否与size相等;

static Criterion sqlRestriction(String sql):直接使用SQL语句作为筛选条件;

static Criterion sqlRestriction(String sql, Object value, Type type):直接使用带参数占位符的SQL语句作为条件,并指定参数值;

static Criterion sqlRestriction(String sql, Object[] value, Type[] type):直接使用带参数占位符的SQL语句作为条件,并指定多个参数值;

如果需要使用关联类的属性来增加查询条件,则应该对属性再次使用createCriteria方法,用法如下:

session.cerateCriteria(Student.class)

.add(Restriction.like(“name”, “天风”)).createCriteria(“classes”).add(Restriction.like(“className”, “班级名”)).list();

注意:查询并不是查询class持久化类,而是查询Student持久化类。

3. SQL查询

Hibernate还支持使用SQL查询,使用SQL查询可以利用某些数据库的特性,或者用于将原有的JDBC应用移植到Hibernate应用上。

SQL查询是通过SQLQuery接口来表示的,由于SQLQuery接口是Query接口的子接口,因此完全可以调用Query接口的方法。

执行SQL查询的步骤如下:

(1) 获取Hibernate Session对象;

(2) 编写SQL语句;

(3) 以SQL语句作为参数,调用Session的createSQLQuery方法创建查询对象;

(4) 如果SQL语句包含参数,则调用Query的setXxx方法为参数赋值;

(5) 调用SQLQuery对象的addEntity或addScale方法将选出的结果与实体关联;

(6) 调用Query的list方法返回查询的结果集

使用如下:

List list = session.createSQLQuery(“SELECT {st.*} FROM student as st ”).addEntity(“st”, Student.class).list();

如果不使用{st.*}形式,就可让实体别名与表别名互不相同,关联实体的类型时,被关联的类必须有对应的setter方法。

转载于:https://my.oschina.net/u/1789796/blog/521943

Hibernate Query数据查询相关推荐

  1. Hibernate数据查询教程

    Hibernate数据查询教程 转载▼9.1  Hibernate数据查询 数据查询与检索是Hibernate的一个亮点.Hibernate的数据查询方式主要有3种,它们是: l         Hi ...

  2. Hibernate的数据过滤查询

    数据过滤并不是一种常规的数据查询方法,而是一种整体的筛选方法.数据过滤也可对数据进行筛选,因此,将其放在Hibernate的数据查询框架中介绍. 如果一旦启用了数据过滤器,则不管数据查询,还是数据加载 ...

  3. Hibernate——Query查询

    原文地址 前两篇文章介绍了获取SessionFactory,Session,以及Session的三种状态及其之间的转换,本文势必要将大家最关心的问题做出介绍,也就是大家最关心的通过Hibernate提 ...

  4. hibernate使用Query进行查询

    本文主要探讨hibernate的简单查询,主要是使用Query进行的查询. 1.首先看下annotation的API中关于查询的描述 2.3. 映射查询 2.3.1. 映射EJBQL/HQL查询 使用 ...

  5. pandas使用query函数查询指定日期索引对应的dataframe数据行(select rows using a single date in dataframe)

    pandas使用query函数查询指定日期索引对应的dataframe数据行(select rows using a single date in dataframe) 目录 pandas使用qu

  6. pandas使用query函数查询dataframe指定数据列的内容(数值)不包含在特定列表中的数据行(not contain in list)

    pandas使用query函数查询dataframe指定数据列的内容(数值)不包含在特定列表中的数据行(select rows which column values are not containe ...

  7. pandas使用query函数查询指定日期索引之间对应的dataframe数据行(select rows date index between a certain date interval)

    pandas使用query函数查询指定日期索引之间对应的dataframe数据行(select rows where date index between a certain date interva ...

  8. pandas使用query函数查询dataframe指定数据列的内容(数值)包含在特定列表中的数据行(select rows which column values contain in list)

    pandas使用query函数查询dataframe指定数据列的内容(数值)包含在特定列表中的数据行(select rows which column values contained in a li ...

  9. hibernate 高级查询 query 或查询 or ,Restrictions

    hibernate 高级查询 query 或查询 or ,Restrictions 今天用了写hibernate高级查询时用了Restrictions(当然Expression也是可以以的)这个类.感 ...

最新文章

  1. TensorFlowMNIST数据集逻辑回归处理
  2. App.config的典型应用
  3. 【转载】从多项式曲线拟合到模式识别的相关概念
  4. Spring AOP 源码分析 - 创建代理对象
  5. php 安装redis数据库,Linux下安装Redis以及phpredis模块
  6. 手把手教你安装VMware虚拟机
  7. java实验报告合肥工业大学_合肥工业大学数据结构上机实验代码与实验报告(全)github地址...
  8. Video在网页和移动端无法自动播放问题??
  9. Java基础---学Java怎么能不了解多线程---Lambda表达式
  10. 第三周笔记 c++ Boolan
  11. lucene分析(未完成)
  12. 电脑显示未安装任何音频输出设备_未安装任何音频输出设备-华硕A556UQ7200(4GB/128GB+500GB/2G独显)...
  13. CorelDraw x6【Cdr x6】官方简体中文破解版(64位)安装图文教程、破解注册方法...
  14. oracle查询第三个字母是A的员工,oracle_day2 限制查询
  15. css3多变形,CSS3 clip-path polygon图形构建与动画变换二三事
  16. 如何对Pandas DataFrame进行自定义排序
  17. (转)使用cygwin注意事项一
  18. 外卖小程序发布商品时,要注意的地方-微信小程序教程32
  19. uniCloud学习笔记---uniId
  20. loadrunner在win7破解提示:Cannot save the license information because acceses to the registry is denied的解

热门文章

  1. 第29月第14天 evpp
  2. 1.搭建JavaEE开发环境
  3. linux下的缓存机制及清理buffer/cache/swap的方法梳理
  4. 利用Python读取外部数据文件
  5. 使用Maven编译项目遇到——“maven编码gbk的不可映射字符”解决办法 ——转载...
  6. C# 声明方法关键字
  7. postgreSQL分页
  8. LamBda学习(一)
  9. vmware下ubuntu重启后不能上网
  10. 本地项目上传到gitlab上