Criteria 进阶查询

    技术2022-05-11  34

    您可以使用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(); 

    最新回复(0)