Hibernate高级查询

简介: @Test DDL创建表hibernate标准化对象查询(QBC)也即是把查询条件封装成一个对象,它支持运行时动态生成查询语句Criteria接口存放查询条件的容器Criteria criteria=session.

@Test
DDL创建表

hibernate标准化对象查询(QBC)

也即是把查询条件封装成一个对象,它支持运行时动态生成查询语句

Criteria接口

存放查询条件的容器

Criteria criteria=session.createCriteria(Class persiistentClass);

//获取所有数据
criteria.list()

//条件查询---》Ctitertion接口的实现类Restrictions

Critertion接口

代表一个查询条件,可以通过他的实现类Restrictions类来产生查询条件,并且还需要通过Criteria的add方法添加到Criteria实例中

Criterion cl=Restrictions.like("name","zhang%");
criteria.add(cl);

多个条件

Criterion cl=Restrictions.like("name","zhang%");
criteria.add(cl);
Criterion c2=Restrictions.eq("age",23);
criteria.add(c2);

或者

Criterion cl=Restrictions.like("name","zhang%");
Criterion c2=Restrictions.eq("age",23);
Criterion c3=Restrictions.and(c1,c2);
criteria.add(c3);

Order类

对查询接口进行排序
通过Criteria的addOrder()方法添加到Criteria实例中,排序方式有
1、Order.desc(String propertyName) //降序排序
2、Order.asc(String propertyName)//升序排

criteria.add(Order.desc(id));

Projection接口

代表投影查询(查询某一列,把结果放到list中),它的Projections类提供了一系列产生具体Projectio实例的静态方法,通过Criteria的setProjection()方法添加到Criteria实例中,Projection类中的函数有
avg(String propertyName)
count(String propertyName)
sum(String propertyName)
min(String propertyName)
max(String propertyName)

离线查询(一般放在一个方法里,这样他可以附加到任意的session)

DetachedCriteria类可以在Session范围外创建一个查询,并且可以附加到任意的Sesssion上来执行查询

DetachedCriteria dc= DetachedCriteria.forClass(Class)
Criteria cr=dc.getExecutableCriteria(session);
cl.list

HQL

子查询(注意子查询的条件怎么写)

内嵌在另一个查询语句中的查询,称为子查询
HQL中的子查询只可以在select或者where子句中出现

String hql ="from XXX x where (select id from XX) "
session.createQuery(hql).list();

连接查询(执行了n+1条sql)

Hibernate中的连接查询只能在建立了关系映射的实体类之间进行可以通过HQL的with关键字,来提供额外的join条件,常见的连接查询有:
内连接([inner]join)
内连接(left [out]join)
内连接(right [out]join)
全连接([full]join)(oracle才支持)

抓取连接查询(无需执行多条sql)

fetch连接 ,只是使用一个查询语句就将相关关联的对象或者一组值的集合随着他们的父对象的初始化而初始化

在 相应的(内,左,右)join 后面 加入 fetch就行
fetch不能和 with 不能同时使用

原生(Native SQL)

单表查询

String sql=select * from xx_table;
//通过 Session.createSQLQuery()来获取SQLQuery接口实例,通过addEntity返回指定类型
SQLQuery query=session.createSQLQuery(sql).addEntity(Xxx.class)
List<Xxx> list=query.list();

多表查询,借助表的别名{a.},{o.}

String sql=select {a.*},{o.*} from aa_table a join bb_table b on a.id=b.id;
//通过别名指定返回类型
SQLQuery query=session.createSQLQuery(sql).addEntity("a",A.class).addEntity("b",B.class);
List list=query.list();
//返回一个Object数组可以这样写
for(int i=0;i<list.size();i++){
    Object[] obj=(Object[])list.get(i);
    A a=obj[0];
    B b=obj[1];
}

存储过程

存储过程/函数必须返回一个结果集,作为Hibernate能够使用的第一个外部参数,在程序中调用,也是使用了原生sql
session.createSQLQuery(“{存储过程}”);

SQLQuery query=session.createSQLQuery("{call pro(:id)}").addEntity(xx.class);
query.setInteger("id",1);
query.list();
相关文章
|
5月前
|
SQL 缓存 Java
什么是hibernate N+1查询
什么是hibernate N+1查询
|
10月前
|
SQL Java 数据库连接
MyBatis实现关联表查询
MyBatis实现关联表查询
71 0
|
10月前
|
SQL Java 大数据
Mybatis单表操作之普通操作、模糊查询、分页查询、动态SQL
Mybatis单表操作之普通操作、模糊查询、分页查询、动态SQL
156 0
|
Java 数据库连接
HQL数据查询(Hibernate推荐)
HQL数据查询(Hibernate推荐)
103 0
|
SQL XML Java
【MyBatis】多条件查询、动态SQL、多表操作、注解开发
多条件查询、动态SQL、多表操作、注解开发
306 0
【MyBatis】多条件查询、动态SQL、多表操作、注解开发
|
XML Java 关系型数据库
Mybatis入门-基于注解实现单表、多表的增删改查
Mybatis入门-基于注解实现单表、多表的增删改查
235 0
|
Java 数据库连接 Apache
Mybatis基础:增删改查、模糊查询、多条件查询
Mybatis基础:增删改查、模糊查询、多条件查询http://www.bieryun.com/3132.html 1、新建测试数据库,根据实体类属性创建 2、实体类 [java] view plain copy package com.
2078 0
|
SQL Java 数据库连接
|
Java MySQL 关系型数据库