hibernate级联查询
1,实体类结构
@Entity @Table(name = "t_vote") public class Vote { private int id; /*** * 1:最宜居
* 2:最优户
* 3:最佳物业 */ private int type; private HouseBuilding houseBuilding; /*** * 投票数 */ private long voteCount; @OneToOne @JoinColumn(name = "house_building_id") public HouseBuilding getHouseBuilding() { return houseBuilding; } }
@Entity @Table(name = "t_house") public class HouseBuilding { private int id; private String name; private String address; private Float price; /*** * 预留 */ private String reserved; }
2,关系
Vote和HouseBuilding 是一对一的外键关系,从Vote 可以导航到HouseBuilding,反之不能.
3,查询语句(实例)
Vote vote=super.get("type", type,"houseBuilding.id",houseBuildingId);
super.get 方法体如下:
public T get(String propertyName,Object propertyValue,String propertyName2,Object propertyValue2){ return (T)this.getCurrentSession().createCriteria(clz) .add(Restrictions.eq(propertyName, propertyValue)) .add(Restrictions.eq(propertyName2, propertyValue2)) .uniqueResult(); }
所以实际上相当于:
Vote vote=(Vote) super.getCurrentSession().createCriteria(clz) .add(Restrictions.eq("type", type)) .add(Restrictions.eq("houseBuilding.id",houseBuildingId)) .uniqueResult();
类似于:
Vote vote=(Vote) super.getCurrentSession().createCriteria(clz) .add(Restrictions.eq("type", type)) .createAlias("houseBuilding", "houseBuilding222") .add(Restrictions.eq("houseBuilding222.id", houseBuildingId)) .uniqueResult();
4,执行的SQL 语句
select this_.id as id1_21_1_, this_.house_building_id as house4_21_1_, this_.type as type2_21_1_, this_.vote_count as vote3_21_1_, housebuild2_.id as id1_9_0_, housebuild2_.address as address2_9_0_, housebuild2_.name as name3_9_0_, housebuild2_.price as price4_9_0_, housebuild2_.reserved as reserved5_9_0_ from t_vote this_ left outer join t_house housebuild2_ on this_.house_building_id=housebuild2_.id where this_.type=? and this_.house_building_id=? 07 十月 2015 10:04:22,589 TRACE org.hibernate.type.descriptor.sql.BasicBinder:84 - binding parameter [1] as [INTEGER] - 1 07 十月 2015 10:04:22,590 TRACE org.hibernate.type.descriptor.sql.BasicBinder:84 - binding parameter [2] as [INTEGER] - 3
5,使用Restrictions.eq 来进行条件查询时,第一个参数可以采用"属性.子属性"的形式
6,在单元测试中,加载hibernate配置文件
@BeforeClass public static void before() { ctx = new ClassPathXmlApplicationContext("beans.xml"); // clientVersionDao = (ClientVersionDao) ctx.getBean("clientVersionDao"); // oSVersionDao = (OSVersionDao) ctx.getBean("osVersionDao"); // osTypeDao = (OsTypeDao) ctx.getBean("osTypeDao"); paperNewsDao = (PaperNewsDao) ctx.getBean("paperNewsDao"); voteDao = (VoteDao) ctx.getBean("voteDao"); }
7,源代码
上述代码中的super指com.common.dao.generic.GenericDao ,详见附件