hibernate的查询条件lt_Hibernate Criteria按条件查询(Query By Criteria, QBC)

Hibernate Criteria查询详解:条件、排序、分页与投影
本文详细介绍了Hibernate的Criteria查询,包括如何创建查询条件、限制结果集、排序与分页、关联实体约束以及投影操作。通过示例展示了使用Restrictions工具类创建各种查询条件,如eq、like、between等,并演示了如何进行结果排序、分页和获取特定属性。同时,还提到了Criteria在多表关联查询中的应用,以及Projection用于获取特定字段的值。

org.hibernate.Criteria接口表示特定持久类的一个查询。

Criteria 代表一次查询

Criterion 代表一个查询条件。

Restrictions 产生查询条件的工具类。

Criterion 是Criteria的查询条件。Criteria提供了add(Criterion criterion)方法来

1:添加查询条件。

Session是Criteria实例的工厂。

Criteria criteria = sess.createCriteria(News.class);

Listnews = criteria.list();

2:限制结果集内容

一个单独的查询条件是org.hibernate.criterion.Criterion接口的一个实例。org.hibernate.criterion.Restrictions类 定义了获得某些内置Criterion类型的工厂方法。Criterion的实例可以通过Restrictions工具类来创建

Listnews = sess.createCriteria(News.class)

.add( Restrictions.like("title", "%fendou%") )

.add( Restrictions.between("id",2,8) )

.list();

Restrictions 提供了大量的静态

方法,如 eq(等于)、ge(大于等于)、between等来方法的创建Criterion查询条件 ,通过往该实例的add(Criteria)方法来增加查询条件形成一个查询条件集合。

HQL运算符

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来为查询结果排序

Listnews = sess.createCriteria(News.class)

.add( Restrictions.like("title", "%F%")

.addOrder( Order.desc("id") )

.setFirstResult(0)

.setMaxResults(20)

.list();

4:使用createCriteria()非常容易的在互相关联的实体间建立约束

Criteriac=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

Object[] obj=(Object[])news.get(i);

System.out.println(obj[0]+"***"+obj[1]);

}

6:查询示例(Query ByExample, QBE)

org.hibernate.criterion.Example类允许你通过一个给定实例 构建一个条件查询(主要用于模糊查询)

List news=new ArrayList();

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

select * from news_news n

实现类调用:

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里要要使用这个查询,你需要通过命名查询来映射它.

{ ? = call selectAllnews () }

news=session.getNamedQuery("callselectAllnews")

.list();

对存储过程进行的查询无法使用setFirstResult()/setMaxResults()进行分页

Hibernate过滤数据

Hibernate3 提供了一种创新的方式来处理具有“显性(visibility)”规则的数据,那就是使用Hibernate filter。Hibernate filter是全局有效的、具有名字、可以带参数的过滤器, 对于某个特定的Hibernate session您可以选择是否启用(或禁用)某个过滤器。过滤器条件相当于定义一个 非常类似于类和各种集合上的“where”属性的约束子句

1:定义一个过滤器

节点之内的节点

2:定义好之后,就可以在某个类中要使用的属性下使用这个过滤器:

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

通过使用过滤器可以定义常用的筛选规则,如果是临时的还是使用常规的查询比较好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值