Hibernate高级查询

  1. 云栖社区>
  2. 博客>
  3. 正文

Hibernate高级查询

嘿嘿!! 2016-09-16 16:53:00 浏览526
展开阅读全文

@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();

网友评论

登录后评论
0/500
评论
嘿嘿!!
+ 关注