Hibernate Criteria 多层次查询关联问题 HibernateJava

hibernate存在如下表及关联:

Java代码   收藏代码
  1. class House{  
  2.   private string houseid;  
  3.   private string housename;  
  4. }  
  5. class Shelf{  
  6.   private string shelfid;  
  7.   private House house;  
  8. }  
  9. class Position{  
  10.   private string positionid;  
  11.   private Shelf shelf;  
  12. }  
  13. class Warehouse{  
  14.   private string warehouseid;  
  15.   private Position position;  
  16. }  

Warehouse外键关联Pisition, Position外键关联Shelf, Shelf外键关联houseid。
现在要对Warehouse使用Criteria查询, 查询House的id,可使用如下方法:
Java代码   收藏代码
  1. Criteria criteria = BaseUtil.getCriteria(Warehouse.class);  
  2. criteria.createAlias("position""position");  
  3. criteria.createAlias("position.shelf""shelf");  
  4. criteria.add(Expression.eq("shelf.house.houseid""111"));  

如果要查询House的name, 必须再关联House表:
Java代码   收藏代码
  1. Criteria criteria = BaseUtil.getCriteria(Warehouse.class);  
  2. criteria.createAlias("position""position");  
  3. criteria.createAlias("position.shelf""shelf");  
  4. criteria.createAlias("shelf.house""house");  
  5. criteria.add(Expression.eq("house.housename""name A"));  

以上代码就可以实现了。

可是还会出现一个问题:如果表路径position已经被关联过了(比如此criteria是传入的参数,已经关联了Alias路径position, 并查询过了),则会报错。解决方法:
检查criteria里面关联的路径,如果已经关联,则不再关联,直接使用就行了。
Java代码   收藏代码
  1. class CriteriaUtil{  
  2. public static Criteria addAlias(CriteriaImpl criteriaImpl, String path, String name){  
  3.   if(path == nullreturn criteriaImpl;  
  4.   for(Iterator iter = criteriaImpl.iterateSubcriteria();iter.hasNext();){  
  5.     Subcriteria subCriteria = (Subcriteria)iter.next();  
  6.     if(path.equals(subCriteria.getPath()))  
  7.       return criteriaImpl;  
  8.   }  
  9.   return criteriaImpl.createAlias(path, name);  
  10. }  
  11. }  

(注:这段代码有时是存在问题的,不是所有的Criteria 都能转换为CriteriaImpl,可能会是Subcriteria。因此,需要确保传入的参数为CriteriaImpl)

调用代码就变成:

Java代码   收藏代码
  1. Criteria criteria = BaseUtil.getCriteria(Warehouse.class);  
  2. CriteriaUtil.addAlias((CriteriaImpl)criteria, "position""position");  
  3. CriteriaUtil.addAlias((CriteriaImpl)criteria, "position.shelf""shelf");  
  4. criteria.add(Expression.eq("shelf.house.houseid""111"));  

你可能感兴趣的:(Hibernate Criteria 多层次查询关联问题 HibernateJava)