Hibernate读书笔记-----条件查询(二)

2014-11-24 08:41:45 · 作者: · 浏览: 4
如果我们希望对分组后属性进行排序,那就需要为投影运算指定一个别名了,有两种方法可以为投影运算指定别名
1、使用alias()方法
[java]
List list = session.createCriteria(Person.class)
.setProjection(Projections.alias(Projections.groupProperty("name"), "name"))
.addOrder(Order.asc("age"))
.list();

2、使用as()方法为自身指定别名
[java]
List list = session.createCriteria(Person.class)
.setProjection(Projections.groupProperty("name").as("name"))
.addOrder(Order.asc("age"))
.list();
也可以使用Property.forName()来表示投影:
[java] www.2cto.com
List list = session.createCriteria(Person.class)
.setProjection(Projections.projectionList()
.add(Property.forName("name")))
.list();

四、离线查询和子查询
条件查询的离线查询有DetachedCriteria来代表,DetachedCriteria类允许在一个session范围外创建一个 查询,并且可以使用任意Session来执行它。
[java]
public void detachedCriteriaTest(){
//定义一个离线查询
DetachedCriteria query = DetachedCriteria.forClass(Person.class).setProjection(Property.forName("name"));
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
//执行离线查询
List list = query.getExecutableCriteria(session).list();

for (Iterator iterator = list.iterator();iterator.hasNext();) {
Person person = (Person) iterator.next();
System.out.println(person.getName());
}
}

另外DetachedCriteria还可以代表子查询,当我们把DetachedCriteria传入Criteria中作为查询条件时,DetachedCriteria就变成了子查询。
[java]
public void subQuery(){
//定义一个离线查询
DetachedCriteria query = DetachedCriteria.forClass(Person.class).setProjection(Property.forName("name"));
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
//执行子查询
List list = session.createCriteria(Person.class)
.add(Property.forName("name").in(query))
.list();
for (Iterator iterator = list.iterator();iterator.hasNext();) {
Person person = (Person) iterator.next();
System.out.println(person.getName());
}
}

作者:chenssy