Hibernate Criteria 多层次查询关联问题
2011-03-13 01:59
441 查看
Java代码
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,可使用如下方法:
Java代码
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表:
Java代码
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里面关联的路径,如果已经关联,则不再关联,直接使用就行了。
Java代码
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)
调用代码就变成:
Java代码
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"
));
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;
}
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,可使用如下方法:
Java代码
Criteria criteria = BaseUtil.getCriteria(Warehouse.
class
);
criteria.createAlias(
"position"
,
"position"
);
criteria.createAlias(
"position.shelf"
,
"shelf"
);
criteria.add(Expression.eq(
"shelf.house.houseid"
,
"111"
));
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表:
Java代码
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"
));
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里面关联的路径,如果已经关联,则不再关联,直接使用就行了。
Java代码
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);
}
}
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)
调用代码就变成:
Java代码
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"
));
相关文章推荐
- Hibernate Criteria 多层次查询关联问题 HibernateJava
- Hibernate Criteria 多层次查询关联问题
- Hibernate Criteria 多层次查询关联问题
- Hibernate中criteria一对多关联查询时distinct的分页和数量问题
- hibernate一对多关联查询去重 criteria设置 解决分页条数不正确的问题
- Hibernate多对多关联映射的HQL中的in条件查询问题
- Hibernate多对多关联映射的HQL中的in条件查询问题
- hibernate criteria 多表关联查询
- Hibernate框架中Criteria的示例查询问题
- Hibernate多对多关联映射的HQL中的in条件查询问题
- 请教一下hibernate中的criteria分组查询语句报类转换错误,出了什么问题?
- 关于hibernate纯sql查询返回结果集的问题(hbm.xml中不写多表关联)
- 关于hibernate纯sql查询返回结果集的问题(hbm.xml中不写多表关联)
- hibernate关于criteria多表查询问题
- 关于hibernate纯sql查询返回结果集的问题(hbm.xml中不写多表关联)
- 关于Hibernate的DetachedCriteria查询的addOrder问题的解决办法
- Hibernate原生SQL查询多表关联,SQL语句要注意的问题
- hibernate DetachedCriteria多对一关联 内连接查询
- 关于Hibernate中fatch=eager的bag集合(一个java List)使用Criteria查询出现重复记录的问题
- 求助Hibernate问题(我使用Criteria 查询数据库表时,当客户端调用到第3次就出现问题 )