现在的位置: 首页 > 综合 > 正文

hiberante常用查询语句例子

2014年07月15日 ⁄ 综合 ⁄ 共 3589字 ⁄ 字号 评论关闭

一、Hibernate 中聚合函数的使用
Criteria接口的Projections类主要用于帮助Criteria接口完成数据的分组查询和统计功能:

List cats=session.createCriteria(Cat.class)
                .setProjection(Projections.projectionList()
                .add(Projections.rowCount())
                .add(Projections.avg(
"weight"))
                .add(Projections.max(
"weight"))
                .add(Projections.min(
"weight"))
                .add(Projections.groupProperty(
"color"))
            ).addOrder(Order.asc(
"color")).list();


示例
代码相当于:
select color,count(*),avg(weight),max(weight),min(weight),min(weight) from cat group by color ordy color asc;

二、条件查询(Criteria Queries)
具有一个直观的、可扩展的条件查询API是Hibernate的特色。

1. 创建一个Criteria 实例
org.hibernate.Criteria接口表示特定持久类的一个查询。Session是 Criteria实例的工厂。

Criteria crit = sess.createCriteria(Cat.class);
crit.setMaxResults(
50);
List cats
= crit.list();

2. 限制结果集内容

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

List cats = sess.createCriteria(Cat.class)
     .add( Restrictions.like(
"name", "Fritz%") )
     .add( Restrictions.between(
"weight", minWeight, maxWeight) )
     .list();

约束可以按逻辑分组。

List cats = sess.createCriteria(Cat.class)
     .add( Restrictions.like(
"name", "Fritz%") )
     .add( Restrictions.or(
         Restrictions.eq(
"age", new Integer(0) ),
         Restrictions.isNull(
"age")
     ) )
     .list();
List cats = sess.createCriteria(Cat.class)
     .add( Restrictions.in(
"name", new String[] { "Fritz", "Izi", "Pk" } ) )
     .add( Restrictions.disjunction()
         .add( Restrictions.isNull(
"age") )
         .add( Restrictions.eq(
"age", new Integer(0) ) )
         .add( Restrictions.eq(
"age", new Integer(1) ) )
         .add( Restrictions.eq(
"age", new Integer(2) ) )
     ) )
     .list();

Hibernate提供了相当多的内置criterion类型(Restrictions 子类), 但是尤其有用的是可以允许你直接使用SQL。

List cats = sess.createCriteria(Cat.class)
     .add( Restrictions.sql(
"lower({alias}.name) like lower(?)", "Fritz%", Hibernate.STRING) )
     .list();

{alias}占位符应当被替换为被查询实体的列别名。

Property实例是获得一个条件的另外一种途径。你可以通过调用Property.forName() 创建一个Property。

Property age = Property.forName("age");
List cats
= sess.createCriteria(Cat.class)
     .add( Restrictions.disjunction()
         .add( age.isNull() )
         .add( age.eq(
new Integer(0) ) )
         .add( age.eq(
new Integer(1) ) )
         .add( age.eq(
new Integer(2) ) )
     ) )
     .add( Property.forName(
"name").in( new String[] { "Fritz", "Izi", "Pk" } ) )
     .list();

3. 结果集排序
你可以使用org.hibernate.criterion.Order来为查询结果排序。

List cats = sess.createCriteria(Cat.class)
     .add( Restrictions.like(
"name", "F%")
     .addOrder( Order.asc(
"name") )
     .addOrder( Order.desc(
"age") )
     .setMaxResults(
50)
     .list();

List cats = sess.createCriteria(Cat.class)
     .add( Property.forName(
"name").like("F%") )
     .addOrder( Property.forName(
"name").asc() )
     .addOrder( Property.forName(
"age").desc() )
     .setMaxResults(
50)
     .list();

4. 关联
你可以使用createCriteria()非常容易的在互相关联的实体间建立 约束。

List cats = sess.createCriteria(Cat.class)
     .add( Restrictions.like(
"name", "F%")
     .createCriteria(
"kittens")
         .add( Restrictions.like(
"name", "F%")
     .list();

注意第二个 createCriteria()返回一个新的 Criteria实例,该实例引用kittens 集合中的元素。

接下来,替换形态在某些情况下也是很有用的。

List cats = sess.createCriteria(Cat.class)
     .createAlias(
"kittens", "kt")
     .createAlias(
"mate", "mt")
     .add( Restrictions.eqProperty(
"kt.name", "mt.name") )
     .list();

(createAlias()并不创建一个新的 Criteria实例。)

Cat实例所保存的之前两次查询所返回的kittens集合是 没有被条件预过滤的。如果你希望只获得符合条件的kittens, 你必须使用returnMaps()。

List cats = sess.createCriteria(Cat.class)
     .createCriteria(
"kittens", "kt")
         .add( Restrictions.eq(
"name", "F%") )
     .returnMaps()
     .list();
Iterator iter
= cats.iterator();
while ( iter.hasNext() ) {
     Map map
= (Map) iter.next();
     Cat cat
= (Cat) map.get(Criteria.ROOT_ALIAS);
     Cat kitten
= (Cat) map.get("kt");
}

抱歉!评论已关闭.