Hibernate Criteria-初学者学习~~~

1.标准查询简介(QBC:Query By Criteria)

Hibernate 提供了操纵对象和相应的 RDBMS 表中可用的数据的替代方法。一种方法是标准的 API,它允许你建立一个标准的可编程查询对象来应用过滤规则和逻辑条件。

Hibernate Session 接口提供了 createCriteria() 方法,可用于创建一个 Criteria 对象,使当您的应用程序执行一个标准查询时返回一个持久化对象的类的实例。

Criteria cr = session.createCriteria(Employee.class);  
List results = cr.list();

QBC (Query By Criteria) 主要有Criteria,Criterion,Oder,Restrictions类组成

@Override
    public List<Role> getAllRoles() {
        // TODO Auto-generated method stub
        
        List<Role> roles = null;        
        Session session =sessionFactory.getCurrentSession();
        
        Criteria criteria = session.createCriteria(Role.class);        
        Criterion criterion = Restrictions.eq("roleServer", "一梦十年");
        criteria.add(criterion);        
        roles = criteria.list();    
        
        return roles;
    }

2.比较运算符

=   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() 等于列表中的某一个值
ont in(列表)   Restrictions.not(Restrictions.in())不等于列表中任意一个值
between x and y   Restrictions.between() 闭区间xy中的任意值
not between x and y   Restrictions.not(Restrictions..between()) 小于值X或者大于值y

 使用逻辑表达式创建 in 的条件组合

  cri.add(Restrictions.in("chcStatus", new Object[]{"2","3","4"})); 

使用逻辑表达式创建 AND 或 OR 的条件组合

@Override
    public List<Role> getAllRoles() {
        // TODO Auto-generated method stub
        
        List<Role> roles = null;        
        Session session =sessionFactory.getCurrentSession();
        
        Criteria criteria = session.createCriteria(Role.class);        
        Criterion serverName = Restrictions.eq("roleServer", "一梦十年");
        Criterion userOrder = Restrictions.eq("roleOrder", 1);
        LogicalExpression andExp = Restrictions.and(serverName, userOrder);
        criteria.add(andExp);
        return roles;
    }

你可以直接使用SQL。

List cats = sess.createCriteria(Cat.class) 

.add( Restrictions.sql("lower({alias}.name) like lower(?)", "Fritz%", 

Hibernate.STRING) )

.list();

3.分页使用标准

这里有两种分页标准接口方法:

序号方法描述
1public Criteria setFirstResult(int firstResult),这种方法需要一个代表你的结果集的第一行的整数,以第 0 行为开始。
2public Criteria setMaxResults(int maxResults),这个方法设置了 Hibernate 检索对象的 maxResults

利用上述两种方法结合在一起,我们可以在我们的 Web 或 Swing 应用程序构建一个分页组件。以下是一个例子,利用它你可以一次取出 10 行

Criteria cr = session.createCriteria(Employee.class);
cr.setFirstResult(1);
cr.setMaxResults(10);
List results = cr.list();

4.排序结果

标准 API 提供了 org.hibernate.criterion.order 类可以去根据你的一个对象的属性把你的排序结果集按升序或降序排列。这个例子演示了如何使用 Order 类对结果集进行排序:

Criteria cr = session.createCriteria(Employee.class);
// To get records having salary more than 2000
cr.add(Restrictions.gt("salary", 2000));

// To sort records in descening order
crit.addOrder(Order.desc("salary"));

// To sort records in ascending order
crit.addOrder(Order.asc("salary"));

List results = cr.list();

5.预测与聚合

标准 API 提供了 org.hibernate.criterion.projections 类可得到各属性值的平均值,最大值或最小值。Projections 类与 Restrictions 类相似,均提供了几个获取预测实例的静态工厂方法。

以下是几个例子,涵盖了不同的情况,可按要求进行使用:

Criteria cr = session.createCriteria(Employee.class);

// To get total row count.
cr.setProjection(Projections.rowCount());

// To get average of a property.
cr.setProjection(Projections.avg("salary"));

// To get distinct count of a property.
cr.setProjection(Projections.countDistinct("firstName"));

// To get maximum of a property.
cr.setProjection(Projections.max("salary"));

// To get minimum of a property.
cr.setProjection(Projections.min("salary"));

// To get sum of a property.
cr.setProjection(Projections.sum("salary"));

查询示例

org.hibernate.criterion.Example类允许你通过一个给定实例 构建一个条件查询。

Role role = null;
        Session session = sessionFactory.getCurrentSession();
        
        Role demoRole = new Role();
        demoRole.setRoleSect("星宿");
        
        Example example = Example.create(demoRole).excludeZeroes() ;
        Criteria criteria = session.createCriteria(Role.class);
        
        List<Role> roles =criteria.add(example).list();

注意:如何实体类中如果有int 或者doubole 类型的值而没有设置值,一定要加 excludeZeroes() 条件

 

Example example = Example.create(cat)
 

.excludeZeroes() //exclude zero valued properties
 

.excludeProperty("color") //exclude the property named "color"
 
.ignoreCase() //perform case insensitive string comparisons 

.enableLike(); //use like for string comparisons 

List results = session.createCriteria(Cat.class) 

.add(example) 

.list();

投影(Projections)、聚合(aggregation)和分组(grouping

16.7. 投影(Projections)、聚合(aggregation)和分组(grouping)


org.hibernate.criterion.Projections是 Projection 的实例工厂。我们通过调用 setProjection()应用投影到一个查询。


List results = session.createCriteria(Cat.class)

.setProjection( Projections.rowCount() )

.add( Restrictions.eq("color", Color.BLACK) )

.list(); 

List results = session.createCriteria(Cat.class)

.setProjection( Projections.projectionList() 

.add( Projections.rowCount() ) 

.add( Projections.avg("weight") ) 

.add( Projections.max("weight") ) 

.add( Projections.groupProperty("color") ) 
)
.list();

 

在一个条件查询中没有必要显式的使用 "group by" 。某些投影类型就是被定义为 分组投影,他们也出现在SQL的group by子句中。 

你可以选择把一个别名指派给一个投影,这样可以使投影值被约束或排序所引用。下面是两种不同的实现方式: 

List results = session.createCriteria(Cat.class) 

.setProjection( Projections.alias( Projections.groupProperty("color"), "colr" ) ) 

.addOrder( Order.asc("colr") ) 

.list(); 

List results = session.createCriteria(Cat.class)

.setProjection( Projections.groupProperty("color").as("colr") ) 

.addOrder( Order.asc("colr") ) 

.list();

 

alias()和as()方法简便的将一个投影实例包装到另外一个 别名的Projection实例中。简而言之,当你添加一个投影到一个投影列表中时 你可以为它指定一个别名:

 

List results = session.createCriteria(Cat.class) 

.setProjection( Projections.projectionList() 

.add( Projections.rowCount(), "catCountByColor" ) 

.add( Projections.avg("weight"), "avgWeight" ) 

.add( Projections.max("weight"), "maxWeight" ) 

.add( Projections.groupProperty("color"), "color" ) 

)
.addOrder( Order.desc("catCountByColor") ) 

.addOrder( Order.desc("avgWeight") ) 

.list();

List results = session.createCriteria(Domestic.class, "cat") 

.createAlias("kittens", "kit") 

.setProjection( Projections.projectionList() 

.add( Projections.property("cat.name"), "catName" ) 

.add( Projections.property("kit.name"), "kitName" ) 

)
.addOrder( Order.asc("catName") ) 

.addOrder( Order.asc("kitName") ) 

.list();

 

你也可以使用Property.forName()来表示投影: 

List results = session.createCriteria(Cat.class)

.setProjection( Property.forName("name") ) 

.add( Property.forName("color").eq(Color.BLACK) ) 

.list();
 

List results = session.createCriteria(Cat.class) 

.setProjection( Projections.projectionList() 

.add( Projections.rowCount().as("catCountByColor") )

.add( Property.forName("weight").avg().as("avgWeight") ) 

.add( Property.forName("weight").max().as("maxWeight") ) 

.add( Property.forName("color").group().as("color" )

)

.addOrder( Order.desc("catCountByColor") )

.addOrder( Order.desc("avgWeight") ) 

.list();

 

 离线(detached)查询和子查询

DetachedCriteria类使你在一个session范围之外创建一个查询,并且可以使用任意的 Session来执行它。

DetachedCriteria query = DetachedCriteria.forClass(Cat.class) 

.add( Property.forName("sex").eq('F') ); 

Session session = ....; 

Transaction txn = session.beginTransaction(); 

List results = query.getExecutableCriteria(session).setMaxResults(100).list(); 

txn.commit(); 

session.close();

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值