- class House{
- private string houseid;
- private string housename;
- }
- class Shelf{
- private string shelfid;
- private House house;
- }
- class Position{
- private string positionid;
- private Shelf shelf;
- }
- class Warehouse{
- private string warehouseid;
- private Position position;
- }
Warehouse外鍵關聯Pisition, Position外鍵關聯Shelf, Shelf外鍵關聯houseid。
現在要對Warehouse使用Criteria查詢, 查詢House的id,可使用如下方法:
- Criteria criteria = BaseUtil.getCriteria(Warehouse.class);
- criteria.createAlias("position", "position");
- criteria.createAlias("position.shelf", "shelf");
- criteria.add(Expression.eq("shelf.house.houseid", "111"));
如果要查詢House的name, 必須再關聯House表:
- Criteria criteria = BaseUtil.getCriteria(Warehouse.class);
- criteria.createAlias("position", "position");
- criteria.createAlias("position.shelf", "shelf");
- criteria.createAlias("shelf.house", "house");
- criteria.add(Expression.eq("house.housename", "name A"));
以上代碼就可以實現了。
可是還會出現一個問題:如果表路徑position已經被關聯過了(比如此criteria是傳入的參數,已經關聯了Alias路徑position, 並查詢過了),則會報錯。解決方法:
檢查criteria裏面關聯的路徑,如果已經關聯,則不再關聯,直接使用就行了。
- class CriteriaUtil{
- public static Criteria addAlias(CriteriaImpl criteriaImpl, String path, String name){
- if(path == null) return criteriaImpl;
- for(Iterator iter = criteriaImpl.iterateSubcriteria();iter.hasNext();){
- Subcriteria subCriteria = (Subcriteria)iter.next();
- if(path.equals(subCriteria.getPath()))
- return criteriaImpl;
- }
- return criteriaImpl.createAlias(path, name);
- }
- }
(注:這段代碼有時是存在問題的,不是所有的Criteria 都能轉換爲CriteriaImpl,可能會是Subcriteria。因此,需要確保傳入的參數爲CriteriaImpl)
調用代碼就變成:
- Criteria criteria = BaseUtil.getCriteria(Warehouse.class);
- CriteriaUtil.addAlias((CriteriaImpl)criteria, "position", "position");
- CriteriaUtil.addAlias((CriteriaImpl)criteria, "position.shelf", "shelf");
- criteria.add(Expression.eq("shelf.house.houseid", "111"));