Hibernate中的层级查询

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: 无效字符

发表评论

电子邮件地址不会被公开。 必填项已用*标注

昵称 *