DetechedCriteria与Criteria
简介
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
假设情形:
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"));
推荐阅读
-
Repeater的FooterTemplate显示某列总计思路与代码
-
深入分析XmlSerializer对象的Xml序列化与反序列化的示例详解
-
学习 SQL 语句 - Select(3): 条件查询与模糊查询
-
Python3下错误AttributeError: ‘dict’ object has no attribute’iteritems‘的分析与解决
-
网页(aspx)与用户控件(ascx)交互逻辑处理实现
-
DetechedCriteria与Criteria
-
Spring Cloud与分布式系统简析
-
设计模式之简单工厂模式与策略模式(通过两种模式设计的计算器/java)
-
基于Jackson的ObjectMapper类进行json字符串与对象之间的互相转换
-
java 中Comparable与Comparator详解与比较