Hibernate的五种查询方式
2017-09-21 16:13
260 查看
原文地址:Hibernate的五种查询方式作者:心碎逍遥
Hibernate有五种常见的查询方式:
(1)NativeSQL
是运用数据库本身提供的数据查询语言进行查询,这种方式查询效率高,与数据库耦合性高依赖于具体的数据库。因为不同的数据库厂商提供的查询语言会存在某些细微差别。
(2)HQL 通过Hibernate提供的查询语言进行查询。Hibernate Query
lanague
(3) EJBQL(JPQL 1.0) 是EJB提供的查询语言
(4)QBC(query by
cretira)通过Cretira接口进行查询
(5)QBE(query by Example)
通过Example编程接口进行查询
从功能强弱上排序:NativeSQL >
HQL > EJBQL(JPQL 1.0) >QBC(query by
cretira) >QBE(query by Example)
QBE (Query By Example)
查询
Criteria cri =
session.createCriteria(Student.class);
cri.add(Example.create(s));
//s是一个 Student 对象
list
cri.list();
实质:创建一个模版,比如我有一个表serial
有一个 giftortoy 字段,我设置
serial.setgifttoy("2"),
则这个表中的所有的giftortoy 为 2 的数据都会出来
QBE查询就是检索与指定样本对象具有相同属性值的对象。因此
QBE 查询的关键就是样本对象的创建,样本对象中的所有非空属性均将作为查询条件。 QBE 查询的功能子集,虽然 QBE 没有 QBC
功能大,但是有些场合 QBE 使用起来更为方便。
工具类Example
为 Criteria 对象指定样本对象作为查询条件
Java代码
1 Session session =
HibernateSessionFactory.getSessionFactory().openSession();
2 Transaction ts =
session.beginTransaction();
3 Customer c =
new
Customer();
4
c.setCname("Hibernate");
5 Criteria criteria =
session.createCriteria(Customer. class
);
6
Criteria.add(Example.create(c));
7 Iterator it =
criteria.list().iterator();
8
ts.commit();
9 HibernateSessionFactory.closeSession();
QBC查询方式
QBC(Query By Criteria)查询方式是 Hibernate 提供的 “ 更加面向对象 ” 的一种检索方式。 QBC
在条件查询上比 HQL 查询更为灵活,而且支持运行时动态生成查询语句。
在Hibernate 应用中使用 QBC 查询通常经过 3 个步骤
(1)使用 Session 实例的 createCriteria() 方法创建 Criteria
对象
(2)使用工具类 Restrictions 的相关方法为 Criteria
对象设置查询对象
(3)使用 Criteria 对象的 list()
方法执行查询,返回查询结果
Restrictions类的常用方法
Restrictions.eq(String propertyName,Object
value)
等于
Restrictions.allEq(Map
propertyNameValues)
使用Map key/value 进行多个等于的比对
Restrictions.gt(String propertyName, Object
value)
大于
>
(gt----->greater than)
Restrictions.ge(String propertyName, Object
value)
大于等于
>=
(ge----->greater equal)
Restrictions.It(String propertyName, Object
value)
小于< (It---->less
than)
Restrictions.Le(String propertyName, Object
value)
小于等于<= (le---->less
equal)
Restrictions.between(String propertyName, Object lo, Object
hi)
对应SQL 语句的 Between 子句
Restrictions.like(String propertyName, Object
value)
对应SQL 语句的 LIKE 子句
Restrictions.in(String propertyName, Collection
value)
对应SQL 语句的 in 子句
Restrictions.and(Criterion lhs, Criterion
rhs)
And关系
Restrictions.or(Criterion lhs, Criterion
rhs)
Or关系
Restrictions.sqlRestriction(String sql,Object[] values,Type[]
types)
SQL限定查询
工具类Order
提供设置排序方式
Order.asc(String propertyName)
升序排序
Order.desc(String propertyName)
降序排序
工具类Projections
提供对查询结果进行统计与分组操作
Porjections.avg(String propertyName)
求某属性的平均值
Projections.count(String propertyName)
统计某属性的数量
Projections.countDistinct(String
propertyName)
统计某属性的不同值的数量
Projections.groupProperty(String
propertyName)
指定一组属性值
Projections.max(String propertyName)
某属性的最大值
Projections.min(String propertyName)
某属性的最小值
Projections.projectionList()
创建一个新的projectionList 对象
Projections.rowCount()
查询结果集中记录的条数
Projections.sum(String propertyName)
返回某属性值的合计
[/b]
QBC分页查询
Criteria为我们提供了两个有用的方法:
setFirstResult(int firstResult) 和 setMaxResults(int
maxResults).
setFirstResult(int firstResult)方法用于指定从哪一个对象开始检索(序号从 0
开始),默认为第一个对象(序号为 0 ); setMaxResults(int maxResults)
方法用于指定一次最多检索出的对象数目,默认为所有对象。
Java代码
1 Session session =
HibernateSessionFactory.getSessionFactory().openSession();
2 Transaction ts = null
;
3 Criteria criteria =
session.createCriteria(Order. class
);
4 int pageSize =
15;
5 int pageNo =
1;
6
criteria.setFirstResult((pageNo-1)*pageSize);
7
criteria.setMaxResults(pageSize);
8 Iterator it =
criteria.list().iterator();
9
ts.commit();
10
HibernateSessionFactory.closeSession();
QBC复合查询
复合查询就是在原有的查询基础上再进行查询。例如在顾客对定单的一对多关系中,在查询出所有的顾客对象后,希望在查询定单中money 大于
1000 的定单对象
DetachedCriteria criteria= DetachedCriteria .
forClass (Model. class );
criteria.add(Restrictions. eq ( "userid" ,
userid));
criteria.add(Restrictions. eq ( "state" , false
));
criteria.add(Restrictions. not ( Expression . eq ( "freeze" , false
) ));
criteria.addOrder( Order. desc ( "createtime" )
);
return modelDAO
.findByCriteria(criteria);
Java代码
1 Session session =
HibernateSessionFactory.getSessionFactory().openSession();
2 Transaction ts =
session.beginTransaction();
3 Criteria cuscriteria =
session.createCriteria(Customer. class
);
4 Criteria ordCriteria =
cusCriteria.createCriteria("orders");
5
ordCriteria.add(Restrictions.gt("money",
new
Double(1000)));
6 Iterator it =
cusCriteria.list().iterator();
7
ts.commit();
8
HibernateSessionFactory.closeSession();
QBC离线查询
离线查询又叫DetachedCriteria 查询,它可以在
Session 之外进行构造,只有在需要执行查询时才与 Session 绑定。
Hibernate有五种常见的查询方式:
(1)NativeSQL
是运用数据库本身提供的数据查询语言进行查询,这种方式查询效率高,与数据库耦合性高依赖于具体的数据库。因为不同的数据库厂商提供的查询语言会存在某些细微差别。
(2)HQL 通过Hibernate提供的查询语言进行查询。Hibernate Query
lanague
(3) EJBQL(JPQL 1.0) 是EJB提供的查询语言
(4)QBC(query by
cretira)通过Cretira接口进行查询
(5)QBE(query by Example)
通过Example编程接口进行查询
从功能强弱上排序:NativeSQL >
HQL > EJBQL(JPQL 1.0) >QBC(query by
cretira) >QBE(query by Example)
QBE (Query By Example)
查询
Criteria cri =
session.createCriteria(Student.class);
cri.add(Example.create(s));
//s是一个 Student 对象
list
cri.list();
实质:创建一个模版,比如我有一个表serial
有一个 giftortoy 字段,我设置
serial.setgifttoy("2"),
则这个表中的所有的giftortoy 为 2 的数据都会出来
QBE查询就是检索与指定样本对象具有相同属性值的对象。因此
QBE 查询的关键就是样本对象的创建,样本对象中的所有非空属性均将作为查询条件。 QBE 查询的功能子集,虽然 QBE 没有 QBC
功能大,但是有些场合 QBE 使用起来更为方便。
工具类Example
为 Criteria 对象指定样本对象作为查询条件
Java代码
1 Session session =
HibernateSessionFactory.getSessionFactory().openSession();
2 Transaction ts =
session.beginTransaction();
3 Customer c =
new
Customer();
4
c.setCname("Hibernate");
5 Criteria criteria =
session.createCriteria(Customer. class
);
6
Criteria.add(Example.create(c));
7 Iterator it =
criteria.list().iterator();
8
ts.commit();
9 HibernateSessionFactory.closeSession();
QBC查询方式
QBC(Query By Criteria)查询方式是 Hibernate 提供的 “ 更加面向对象 ” 的一种检索方式。 QBC
在条件查询上比 HQL 查询更为灵活,而且支持运行时动态生成查询语句。
在Hibernate 应用中使用 QBC 查询通常经过 3 个步骤
(1)使用 Session 实例的 createCriteria() 方法创建 Criteria
对象
(2)使用工具类 Restrictions 的相关方法为 Criteria
对象设置查询对象
(3)使用 Criteria 对象的 list()
方法执行查询,返回查询结果
Restrictions类的常用方法
Restrictions.eq(String propertyName,Object
value)
等于
Restrictions.allEq(Map
propertyNameValues)
使用Map key/value 进行多个等于的比对
Restrictions.gt(String propertyName, Object
value)
大于
>
(gt----->greater than)
Restrictions.ge(String propertyName, Object
value)
大于等于
>=
(ge----->greater equal)
Restrictions.It(String propertyName, Object
value)
小于< (It---->less
than)
Restrictions.Le(String propertyName, Object
value)
小于等于<= (le---->less
equal)
Restrictions.between(String propertyName, Object lo, Object
hi)
对应SQL 语句的 Between 子句
Restrictions.like(String propertyName, Object
value)
对应SQL 语句的 LIKE 子句
Restrictions.in(String propertyName, Collection
value)
对应SQL 语句的 in 子句
Restrictions.and(Criterion lhs, Criterion
rhs)
And关系
Restrictions.or(Criterion lhs, Criterion
rhs)
Or关系
Restrictions.sqlRestriction(String sql,Object[] values,Type[]
types)
SQL限定查询
工具类Order
提供设置排序方式
Order.asc(String propertyName)
升序排序
Order.desc(String propertyName)
降序排序
工具类Projections
提供对查询结果进行统计与分组操作
Porjections.avg(String propertyName)
求某属性的平均值
Projections.count(String propertyName)
统计某属性的数量
Projections.countDistinct(String
propertyName)
统计某属性的不同值的数量
Projections.groupProperty(String
propertyName)
指定一组属性值
Projections.max(String propertyName)
某属性的最大值
Projections.min(String propertyName)
某属性的最小值
Projections.projectionList()
创建一个新的projectionList 对象
Projections.rowCount()
查询结果集中记录的条数
Projections.sum(String propertyName)
返回某属性值的合计
[/b]
QBC分页查询
Criteria为我们提供了两个有用的方法:
setFirstResult(int firstResult) 和 setMaxResults(int
maxResults).
setFirstResult(int firstResult)方法用于指定从哪一个对象开始检索(序号从 0
开始),默认为第一个对象(序号为 0 ); setMaxResults(int maxResults)
方法用于指定一次最多检索出的对象数目,默认为所有对象。
Java代码
1 Session session =
HibernateSessionFactory.getSessionFactory().openSession();
2 Transaction ts = null
;
3 Criteria criteria =
session.createCriteria(Order. class
);
4 int pageSize =
15;
5 int pageNo =
1;
6
criteria.setFirstResult((pageNo-1)*pageSize);
7
criteria.setMaxResults(pageSize);
8 Iterator it =
criteria.list().iterator();
9
ts.commit();
10
HibernateSessionFactory.closeSession();
QBC复合查询
复合查询就是在原有的查询基础上再进行查询。例如在顾客对定单的一对多关系中,在查询出所有的顾客对象后,希望在查询定单中money 大于
1000 的定单对象
DetachedCriteria criteria= DetachedCriteria .
forClass (Model. class );
criteria.add(Restrictions. eq ( "userid" ,
userid));
criteria.add(Restrictions. eq ( "state" , false
));
criteria.add(Restrictions. not ( Expression . eq ( "freeze" , false
) ));
criteria.addOrder( Order. desc ( "createtime" )
);
return modelDAO
.findByCriteria(criteria);
Java代码
1 Session session =
HibernateSessionFactory.getSessionFactory().openSession();
2 Transaction ts =
session.beginTransaction();
3 Criteria cuscriteria =
session.createCriteria(Customer. class
);
4 Criteria ordCriteria =
cusCriteria.createCriteria("orders");
5
ordCriteria.add(Restrictions.gt("money",
new
Double(1000)));
6 Iterator it =
cusCriteria.list().iterator();
7
ts.commit();
8
HibernateSessionFactory.closeSession();
QBC离线查询
离线查询又叫DetachedCriteria 查询,它可以在
Session 之外进行构造,只有在需要执行查询时才与 Session 绑定。
相关文章推荐
- Hibernate查询数据的五种方式
- hibernate Mysql 自增长 注解配置,表无关联的注解方式关联查询
- Hibernate 查询方式(HQL/QBC/QBE)汇总
- Hibernate的几种查询方式-HQL,QBC,QBE,离线查询,复合查询,分页查询
- 小结Hibernate的查询方式(6种)
- Hibernate的学习之路二十八(唯一OID和对象导航的查询的方式)
- hibernate select 查询方式总结
- Hibernate的学习之路三十三(QBC的基本查询方式)
- Hibernate 三种查询方式
- [原创]java WEB学习笔记90:Hibernate学习之路-- -HQL检索方式,分页查询,命名查询语句,投影查询,报表查询
- JDBC中典型的五种查询方式
- Hibernate的三种查询方式
- Hibernate4之Query接口HQL方式查询
- Spring管理 hibernate 事务配置的五种方式
- Hibernate查询方式(补)
- hibernate的三种查询方式
- Hibernate查询方式---HQL方式
- Hibernate检索方式:离线条件查询
- hibernate 三种查询方式
- hibernate六种方式实现的查询