Hibernate提供了完善的按条件(Query By Criteria, QBC)
org.hibernate.Criteria接口表示特定持久类的一个查询。
Criteria 代表一次查询
Criterion 代表一个查询条件。
Restrictions 产生查询条件的工具类。
Criterion 是 Criteria 的查询条件。Criteria 提供了 add(Criterion criterion) 方法来
1:添加查询条件。
Session是 Criteria实例的工厂。
Criteria criteria = sess.createCriteria(News.class);
List news = criteria.list();
2:限制结果集内容
一个单独的查询条件是org.hibernate.criterion.Criterion 接口的一个实例。org.hibernate.criterion.Restrictions类 定义了获得某些内置Criterion类型的工厂方法。Criterion 的实例可以通过 Restrictions 工具类来创建
List news = sess.createCriteria(News.class)
.add( Restrictions.like("title", "%fendou%") )
.add( Restrictions.between("id", 2, 8) )
.list();
Restrictions 提供了大量的静态
方法,如 eq (等于)、 ge (大于等于)、 between 等来方法的创建 Criterion 查询条件 ,通过往该实例的 add(Criteria) 方法来增加查询条件形成一个查询条件集合。
QL运算符
|
QBC运算符
|
含义
|
=
|
Restrictions.eq()
|
等于
|
<>
|
Restrictions.not(Exprission.eq())
|
不等于
|
>
|
Restrictions.gt()
|
大于
|
>=
|
Restrictions.ge()
|
大于等于
|
<
|
Restrictions.lt()
|
小于
|
<=
|
Restrictions.le()
|
小于等于
|
is null
|
Restrictions.isnull()
|
等于空值
|
is not null
|
Restrictions.isNotNull()
|
非空值
|
like
|
Restrictions.like()
|
字符串模式匹配
|
and
|
Restrictions.and()
|
逻辑与
|
and
|
Restrictions.conjunction()
|
逻辑与
|
or
|
Restrictions.or()
|
逻辑或
|
or
|
Restrictions.disjunction()
|
逻辑或
|
not
|
Restrictions.not()
|
逻辑非
|
in(列表)
|
Restrictions.in()
|
等于列表中的某一个值
|
not in(列表)
|
Restrictions.not(Restrictions.in())
|
不等于列表中任意一个值
|
between x and y
|
Restrictions.between()
|
闭区间xy中的任意值
|
not between x and y
|
Restrictions.not(Restrictions..between())
|
小于值X或者大于值y
|
3:结果集排序与分页
可以使用org.hibernate.criterion.Order来为查询结果排序
List news = sess.createCriteria(News.class)
.add( Restrictions.like("title", "%F%")
.addOrder( Order.desc("id") )
.setFirstResult(0)
.setMaxResults(20)
.list();
4: 使用createCriteria()非常容易的在互相关联的实体间建立约束
Criteria c=session.createCriteria(News.class);
news=c.add(Restrictions.in("id", new Long []{2l,4l}))
.add(Restrictions.like("title", "%今日%"))
.createCriteria("category")
.add(Restrictions.eq("id", 2))
.addOrder(Order.desc("id"))
.list();
5:投影(Projections)
org.hibernate.criterion.Projections是 Projection 的实例工厂。我们通过调用setProjection()应用投影到一个查询。
session=HibernateUtil.getSession();
Criteria c=session.createCriteria(News.class);
c.setProjection( Projections.projectionList()
.add( Projections.property("title"))
.add( Projections.property("category")));
news=c.list();
for(int i=0;i<news.size(); i++){
Object[] obj=(Object[])news.get(i);
System.out.println(obj[0]+"***"+obj[1]);
}
6:查询示例 (Query By Example, QBE)
org.hibernate.criterion.Example类允许你通过一个给定实例 构建一个条件查询(主要用于模糊查询)
List<News> news=new ArrayList<News>();
News exn=new News();
exn.setTitle("%今日%");
Example example=Example.create(exn);
example.enableLike();
Session session=HibernateUtil.getSession();
Criteria c=session.createCriteria(News.class);
c.add(example);
news=c.list();
Hibernate 中的原生SQL(Native SQL)查询
Hibernate3允许你使用手写的sql来完成所有的create,update,delete,和load操作(包括存储过程)
1:SQL查询是通过SQLQuery接口来控制的,它是通过调用Session.createSQLQuery()方法来获得
session=HibernateUtil.getSession();
news=session.createSQLQuery("select * from news_news n")
.addEntity(News.class).list();
addEntity()方法将SQL表的实体类联系起来,并且确定查询结果集的返回值形态。
2:原生的SQL查询可能返回一个简单的标量值或者一个标量和实体的结合体
session=HibernateUtil.getSession();
max=(Long)session.createSQLQuery("select max(n.n_id) as maxid from news_news n")
.addScalar("maxid",Hibernate.LONG)
.uniqueResult();
3:命名SQL查询
可以在映射文档中定义查询的名字,然后就可以象调用一个命名的HQL查询一样直接调用命名SQL查询.在这种情况下,我们不 需要调用addEntity()方法.
在po类的xml文件中命名一个sql
<sql-query name="sqlallnews">
<return class="com.fendou.domain.News"/>
select * from news_news n
</sql-query>
实现类调用:
news=session.getNamedQuery("sqlallnews")
4:使用存储过程来查询
Hibernate 3引入了对存储过程查询的支持. 存储过程必须返回一个结果集
如下面存储过程例子:
CREATE OR REPLACE FUNCTION selectAllnews
RETURN SYS_REFCURSOR
AS
st_cursor SYS_REFCURSOR;
BEGIN
OPEN st_cursor FOR
SELECT *
FROM news_news;
RETURN st_cursor;
END;
在Hibernate里要要使用这个查询,你需要通过命名查询来映射它.
<sql-query name="callselectAllnews" callable="true">
<return class="com.fendou.domain.News">
</return>
{ ? = call selectAllnews () }
</sql-query>
news=session.getNamedQuery("callselectAllnews")
.list();
对存储过程进行的查询无法使用setFirstResult()/setMaxResults()进行分页
Hibernate过滤数据
Hibernate3 提供了一种创新的方式来处理具有“显性(visibility)”规则的数据,那就是使用Hibernate filter。 Hibernate filter是全局有效的、具有名字、可以带参数的过滤器, 对于某个特定的Hibernate session您可以选择是否启用(或禁用)某个过滤器。过滤器条件相当于定义一个 非常类似于类和各种集合上的“where”属性的约束子句
1:定义一个过滤器
<hibernate-mapping/> 节点之内的<filter-def/>节点
<filter-def name="newsCategoryfilter">
<filter-param name="catid" type="int"/>
</filter-def>
2:定义好之后,就可以在某个类中要使用的属性下使用这个过滤器:
<filter name=" newsCategoryfilter " condition=":catid =c_id"/>
3:Session中默认是不启用过滤器的,必须通过Session.enabledFilter()方法显式的启用。 该方法返回被启用的Filter的实例
session.enableFilter("newsCategoryfilter ").setParameter("catid", 1);
String hql="from News";
Query query=session.createQuery(hql);
query.setFirstResult(0);
query.setMaxResults(5);
news=query.list();
通过使用过滤器可以定义常用的筛选规则,如果是临时的还是使用常规的查询比较好。
分享到:
相关推荐
Hibernate中的Criteria API是一种用于执行动态查询的机制,它允许开发者在运行时构建SQL查询,而无需直接编写SQL语句。Criteria API提供了更加面向对象的方式来处理数据库查询,这使得代码更易于理解和维护,尤其是...
在Java世界中,Criteria API是JPA(Java Persistence API)的一部分,用于构建动态、类型安全的查询。这个“Criteria标准化对象查询小例子”提供了一个实际应用Criteria API的示例,帮助开发者理解如何利用它来执行...
### Criteria的完整用法详解 #### 一、概述 在基于Spring和Hibernate的项目开发中,Criteria API提供了灵活且强大的查询功能,使开发者能够轻松构建复杂的查询条件,从而提高数据检索的效率与精确度。本文将深入...
### Criteria介绍与使用 在Java开发中,特别是涉及到数据库操作时,经常需要用到各种查询方式来获取数据。在Hibernate框架中,`Criteria`提供了一种非常灵活且强大的查询机制,允许开发者构建复杂的查询条件,而...
在Java持久层框架Hibernate中,Criteria API是一种动态构建SQL查询的方法,它允许开发者在运行时构建查询,提供了更面向对象的查询方式。本篇将详细阐述Hibernate Criteria API的使用。 首先,Criteria API由...
在深入探讨Hibernate与Criteria结合进行模糊查询之前,我们先来了解一下Hibernate和Criteria的基本概念,以及为何选择使用它们进行模糊查询。 ### Hibernate简介 Hibernate是一个开放源代码的对象关系映射(ORM)...
Hibernate Criteria 是一种在Java应用程序中使用Hibernate ORM框架执行SQL查询的方式。它提供了一种面向对象的方式来构建查询,使得代码更加可读和易于维护。Criteria API 提供了多种方法来构建复杂的查询,包括添加...
在Java的持久层框架Hibernate中,Criteria API是一个强大的查询工具,它可以用来替代传统的SQL或HQL(Hibernate Query Language)查询,以实现更加面向对象的数据库交互。Criteria API的设计旨在屏蔽不同数据库之间...
### Hibernate Criteria 排序问题详解 #### 一、前言 在使用Hibernate进行数据库操作时,经常需要对查询结果进行排序处理。对于简单的查询场景,使用HQL(Hibernate Query Language)即可轻松实现排序功能;但对于...
### Hibernate Criteria 查询详解 #### 一、概述 Hibernate Criteria 查询是一种强大的对象化查询方式,它为开发者提供了一种灵活而直观的方式来构建复杂的查询逻辑。与传统的SQL查询相比,Criteria查询更加面向...
Hibernate 中 Criteria 的完整用法 Hibernate 中 Criteria 的完整用法是 Hibernate 框架中的一种查询机制,允许开发者灵活地根据查询条件来组装查询语句。在使用 Spring 和 Hibernate 进行开发时,Criteria 的优势...
### Hibernate-Criteria 模糊查询详解 在Java的持久化技术中,Hibernate作为ORM(对象关系映射)框架的一种,提供了强大的数据访问能力。而其中的`Criteria`接口更是为复杂的查询需求提供了一种灵活且功能强大的...
Hibernate中的Criteria连表查询,包括单表属性查询,多表内连,以及左外连接查询
Hibernate 的 Criteria 用法总结 Hibernate 的 Criteria 是一个完全面向对象、可扩展的条件查询 API,通过它完全不需要考虑数据库底层如何实现、SQL 语句如何实现。Criteria 提供了灵活的查询条件组装方式,能够...
**关联映射Hibernate的Criteria用法详解** 在Java开发中,Hibernate作为一种强大的对象关系映射(ORM)框架,极大地简化了数据库操作。其中,Criteria API是Hibernate提供的一个动态查询工具,它允许开发者以面向...
Hibernate 中 Criteria 的使用 Hibernate 中 Criteria 的使用是 Hibernate 框架中的一种查询机制,对于研究 Hibernate 源码有一些作用。在查询方法设计上可以灵活地根据 Criteria 的特点来方便地进行查询条件的组装...
Hibernate 中 Criteria 的用法 Hibernate 中 Criteria 的用法是 Hibernate 框架中的一种查询机制,它提供了灵活的查询方式,可以根据不同的条件进行查询。Criteria 查询机制主要包括 QBE(Query By Example)、QBC...
- **使用场景**:`Criteria` 适用于即时查询,而 `DetachedCriteria` 更适合跨层传递查询条件。 - **灵活性**:`DetachedCriteria` 提供了更大的灵活性,可以在不同层之间传递而不会丢失查询状态。 #### 三、`...