1、只有两个层次时候的查询:
方法1-利用HQL查询:
public class Pack {
private String id;
private Pack parentPack;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Pack getParentPack() {
return parentPack;
}
public void setParentPack(Pack parentPack) {
this.parentPack = parentPack;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final Pack other = (Pack) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
}
注意,上面Pack类中的equals()和hashCode()方法,这里是利用Eclipse自动生成,我们还可以通过EqualsBuilder生成。覆盖Object的这两个方法,有利于按照业务对对象进行比较,防止按照引用比较。
假设我们有个对象Pack,它是一个层级结构(假设只有两层),如果指定一个包,来查询它的子包(一级),我们可以这样做:
public List<Pack> getChildPacksByHQL(Pack p) throws Exception {
Session session = HibernateUtil.currentSession();
String hql = "from Pack p where p.parentPack=?";
Query query = session.createQuery(hql);
query.setEntity(0, p);
return (List<Pack>) query.list();
}
方法2-利用SQL查询:
public List<Pack> getChildPacksBySQL(Pack p) throws Exception {
Session session = HibernateUtil.currentSession();
String sql = "select {a.*} from tpack a where a.parent_pack_id=?";
SQLQuery query = session.createSQLQuery(sql);
query.addEntity("a", Pack.class);
query.setString(0, p.getId());
return (List<Pack>) query.list();
}
注意:上面的SQL中都是用的是实际数据库对应的表名和字段名字。
2、多个层次时的查询:
可以利用数据库系统提供的递归查询SQL来实现,
具体可以参考我的这篇文章:ORACLE语句在Java代码中执行时报错:ORA-00911: 无效字符