欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

DetechedCriteria与Criteria

程序员文章站 2024-03-02 20:11:28
...

简介

Criteria接口和DetechedCriteria类都继承了CriteriaSpecification接口,都相当于Hibernate查询时的一个容器,用以装条件的。

Criteria的实现类:CriteriaImpl, CriteriaImpl.Subcriteria。

他们的区别主要是创建形式不一样:

criteria是在线的,由session创建。

DetechedCriteria是离线的,Spring框架提供了HibernateTemplate().findByCriteria(detachedCriteria)方法来使用DetechedCriteria作为查询的容器。

DetechedCriteria提供两个静态方法:

                        DetachedCriteria.forClass(Class clazz);
			DetachedCriteria.forEntityName(String entityName);

Criteria和DetechedCriteria都有add(Criterion criterion)方法和setProjection(Projection projection)方法来添加查询查询条件、addOrder(Order order)方法添加排序等。

其中:

Criterion接口作为Criteria的查询条件,主要的实现类有:Junction(包括Disjuction和Conjunction)、Example、SimpleExpression。其中Junction和SimpleExpression实例由Restrictions工具类创建的,Example提供静态方法创建实例。

Projection接口主要是进行报表查询,也可以实现分组,主要的实现类有:SimpleProjection 、 ProjectionList 和、Property

。同样地SimpleProjection 和ProjectionList 实例由Projections工具类创建,Property是对某个字段的设置查询条件的。

Criteria

createAlias(java.lang.String associationPath, java.lang.String alias, JoinType joinType)使用指定的连接类型加入关联,为连接的关联分配一个别名(JoinType 可不写)
createCriteria(java.lang.String associationPath, java.lang.String alias, JoinType joinType)创建一个新的Criteria,在相关的实体上“扎根”,分配给定的别名并使用指定的联接类型(JoinType 可不写)。

假设情形:

class Project{
   public Job Job;
}

class Job{
   public Name;
}

如果需要搜索Job的名称为“sumthing”的所有项目

ICriteria criteriacrit = session
  .CreateCriteria(typeof (Project))
  .CreateCriteria("Job", "job")
  .Add(Restrictions.Eq("job.Name", "sumthing"));

ICriteria aliascrit = session
  .CreateCriteria(typeof (Project))
  .CreateAlias("Job", "job")
  .Add(Restrictions.Eq("job.Name", "sumthing"));

Restrictions

and(Criterion lhs, Criterion rhs)符合两个表达式的组合

conjunction(Criterion... conditions)将表达式组合在一起(A和B和C ...)  相当于and

or(Criterion lhs, Criterion rhs)两个表达式符合其中一个即可

disjunction(Criterion... conditions)将表达式组合在一个单独的析取(A或B或C ...)中。相当于or

eqOrIsNull(java.lang.String propertyName, java.lang.Object value)对指定的属性应用“相等”约束。 和eq(相等)一样

eqProperty(java.lang.String propertyName, java.lang.String otherPropertyName)同上

ge(java.lang.String propertyName, java.lang.Object value)对指定的属性应用“大于或等于”约束;gt为大于,le为小于等于,lt小于,ne不等于

geProperty(java.lang.String propertyName, java.lang.String otherPropertyName)对两个属性之间应用“大于或等于”约束 

ilike(java.lang.String propertyName, java.lang.Object value)不区分大小写的“like”(自己写%)

in(java.lang.String propertyName, java.lang.Object... values)对命名属性应用“in”约束。(可以是集合或其他)

not(Criterion expression)返回表达式的否定

Projections

property(java.lang.String propertyName)属性值投影

count(java.lang.String propertyName)属性值计数投影(看有多少列数据)

countDistinct(java.lang.String propertyName)一个不同的属性值计数投影(多少列不同的数据)

projectionList()创建一个新的投影列表。

alias(Projection projection, java.lang.String alias)通过包装为投影分配别名

                        criteria.setProjection(Projections.alias(Projections.groupProperty("age"), "ageAlies"))
			.addOrder(Order.asc("ageAlies"));