hibernate criteria 分组 排序 关联

来源:互联网 发布:社交网络在线观看 编辑:程序博客网 时间:2024/06/03 21:39

您可以使用Criteria进行查询,并使用Order对结果进行排序,例如使用Oder.asc()由小到大排序(反之则使用desc()):

Criteria criteria = session.createCriteria(User.class);

criteria.addOrder(Order.asc("age"));

List users = criteria.list();

setMaxResults()方法可以限定查询回来的笔数,如果配合setFirstResult()设定传回查询结果第一笔资料的位置,就可以实现简单的分页,例如传回第51笔之后的50笔资料(如果有的话):

Criteria criteria = session.createCriteria(User.class);

criteria.setFirstResult(51);

criteria.setMaxResult(50);

List users = criteria.list();

您可以对查询结果进行统计动作,使用Projections的avg()、rowCount()、count()、max()、min()、 countDistinct()等方法,例如对查询结果的"age"作平均:

Criteria criteria = session.createCriteria(User.class);

criteria.setProjection(Projections.avg("age"));

List users = criteria.list();

Iterator iterator = users.iterator();

while(iterator.hasNext()) {

    System.out.println(iterator.next());      

}

还可以配合Projections的groupProperty()来对结果进行分组,例如以"age"进行分组,也就是如果资料中"age"如果有 20、20、25、30,则以下会显示20、25、30:

Criteria criteria = session.createCriteria(User.class);

criteria.setProjection(Projections.groupProperty("age"));

List users = criteria.list();

Iterator iterator = users.iterator();

while(iterator.hasNext()) {

    System.out.println(iterator.next());      

}

如果想结合统计与分组功能,则可以使用ProjectionList,例如下面的程式会计算每个年龄各有多少个人:

ProjectionList projectionList = Projections.projectionList();

projectionList.add(Projections.groupProperty("age"));

projectionList.add(Projections.rowCount());

Criteria criteria = session.createCriteria(User.class);

criteria.setProjection(projectionList);

List users = criteria.list();

Iterator iterator = users.iterator();

while(iterator.hasNext()) {

    Object[] o = (Object[]) iterator.next();

    System.out.println(o[0] + "\t" + o[1]);

}

如果有一个已知的物件,则可以根据这个物件作为查询的依据,看看是否有属性与之类似的物件,例如:

User user = new User();

user.setAge(new Integer(30));

Criteria criteria = session.createCriteria(User.class);

criteria.add(Example.create(user));

List users = criteria.list();

Iterator iterator = users.iterator();

System.out.println("id \t name/age");

while(iterator.hasNext()) {

    User ur = (User) iterator.next();

    System.out.println(ur.getId() +

                                " \t " + ur.getName() +

                                "/" + ur.getAge());           

}

在这个例子中,user物件中有已知的属性"age"为30,使用Example会自动过滤掉user的空属性,并以之作为查询的依据,也就是找出 "age"同为30的资料。

Criteria可以进行复合查询,即在原有的查询基础上再进行查询,例如在Room对User的一对多关联中,在查询出所有的Room资料之后,希望再查询users中"age"为30的user资料:

Criteria roomCriteria = session.createCriteria(Room.class);

Criteria userCriteria = roomCriteria.createCriteria("users");

userCriteria.add(Restrictions.eq("age", new Integer(30)));

List rooms = roomCriteria.list(); // 只列出users属性中有user之"age"为30的Room

Iterator iterator = rooms.iterator();

hibernte criteria只查询表的的某个字段:


  1. Criteria   criteria=session.createCriteria(User.class);   
  2.  ProjectionList   proList   =   Projections.projectionList();//设置投影集合   
  3.   proList.add(Projections.Property( "userName "));   
  4.   proList.add(Projections.Property( "password "));   
  5.   criteria.setProjection(proList);  
统计+分组 +关联查询

Criteria c = getSession().createCriteria(Infos.class);
        c.add(Restrictions.in("infoType", infoType));
        c.add(Restrictions.eq("infoStatus", 3));
        c.setProjection(Projections.projectionList()
                .add(Projections.groupProperty("infoType"))
                .add(Projections.max("infoTime"),"infoTime"));
        List<Object> l = c.list();
        Object[] types=new Object[l.size()];
        Timestamp[] times=new Timestamp[l.size()];
        int i=0;
        for(Object o:l){
            Object[]obj=(Object[]) o;
            types[i]=obj[0];
            times[i]=(Timestamp) obj[1];
            i++;
        }
        c=getSession().createCriteria(Infos.class);
        c.add(Restrictions.in("infoType", types))
        .add(Restrictions.in("infoTime",times));
        List<Infos> list=c.list();


Criteria 使用关联查询

注意 :1` pubStationsV  是   PubTabTimeDate持久内中  关联对象名  , 不是 持久类名 

             2`  projectionList 只能使用一次 多次没用

                     3` 别名是用很关键(pv) 否则 管理表中属性 找不到  会报错

Session session = pubTabTimeDateDao.getCurrentSession();
        Criteria c = session.createCriteria(PubTabTimeDate.class,"p");
        ProjectionList projectionList=Projections.projectionList();
        projectionList.add(Projections.distinct(Projections.property("p.fstationnum")));
        projectionList.add(Projections.property("pv.faddress"));
        c.addOrder(Order.desc("p.fstationnum"))
        .setFirstResult(0)
        .setMaxResults(30);
        Criteria cc = c.createCriteria("pubStationsV","pv");
        c.setProjection(projectionList);
        List list = cc.list();
0 0
原创粉丝点击