当前位置: 首页>后端>正文

yii1 attributes 查询 criteria查询

Criteria对SQL进行封装,让开发人员可以用物件的方式来对资料库进行操作,例如下面的查询User表格中的所有资料:
 
 Criteria criteria = session.createCriteria(User.class); 
// 查询user所有栏位 
List users = criteria.list(); 
Iterator iterator =  users.iterator(); 
System.out.println("id /t name/age"); 
while(iterator.hasNext()) { 
    User user = (User) iterator.next();  
    System.out.println(user.getId() + 
                               " /t " + user.getName() + 
                               "/" + user.getAge());             
}  
 
 Hibernate实际上使用以下的SQL来查询资料库:
 
 
select this_.id as id0_, this_.name as name0_0_, this_.age as age0_0_ from user this_ 
 
 
 Criteria实际上只是个容器,如果想要设定查询条件,则要使用add()方法加入Restrictions的条件限制,例如查询age大于20且小于40的资料:
 
 
Criteria criteria = session.createCriteria(User.class); 
criteria.add(Restrictions.gt("age", new Integer(20))); 
criteria.add(Restrictions.lt("age", new Integer(40))); 
List users = criteria.list();  
 
 您也可以使用逻辑组合来进行查询,例如结合age等于(eq)20或(or)age为空(isNull)的条件: 
 
 
Criteria criteria = session.createCriteria(User.class); 
criteria.add(Restrictions.or(  
                   Restrictions.eq("age", new Integer(20)),  
                   Restrictions.isNull("age")  
               ));  
List users = criteria.list();  
 
 也可以使用sqlRestriction()方法来提供SQL语法作限定查询,例如查询name以cater开头的资料:
 
 
Criteria criteria = session.createCriteria(User.class); 
criteria.add(Restrictions.sqlRestriction("{alias}.name LIKE (?)", "cater%", Hibernate.STRING)); 
List users = criteria.list();  
 
 其中alias将被替换为与User类别相关的名称,而?将被替换为cater%,也就是第二个参数所提供的值,在SQL撰写时,不必再写WHERE,如果有多个查询条件,例如BETWEEN子句的查询,则可以如下:
 
 
Criteria criteria = session.createCriteria(User.class); 
Integer[] ages = {new Integer(20), new Integer(40)}; 
Type[] types = {Hibernate.INTEGER, Hibernate.INTEGER}; 
criteria.add(Restrictions.sqlRestriction("{alias}.age BETWEEN (?) AND (?)", ages, types)); 
List users = criteria.list();  
 
 Restrictions的几个常用限定查询方法如下表所示:
 
 
方法
说明
Restrictions.eq
等于
Restrictions.allEq
使用Map,使用key/value进行多个等于的比对
Restrictions.gt
大于 >
Restrictions.ge
大于等于 >=
Restrictions.lt
小于 <
Restrictions.le
小于等于 <=
Restrictions.between
对应SQL的BETWEEN子句
Restrictions.like
对应SQL的LIKE子句
Restrictions.in
对应SQL的in子句
Restrictions.and
and关系
Restrictions.or
or关系
Restrictions.sqlRestriction
SQL限定查询

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

https://www.xamrdz.com/backend/3ra1934814.html

相关文章: