Hibernate中三表联结的HQL语句写法

数据库表 food_menu_plan结构图:

+-------------------+----------------+--------+--------+-----------+-----------------------+

| Field                 | Type              | Null   | Key    | Default | Extra                       |
+-------------------+----------------+--------+--------+-----------+-----------------------+
| id                       | int(11)           | NO   | PRI     | NULL    | auto_increment    |
| type                   | varchar(45) | YES  |            | NULL    |                                 |
| img                    | varchar(45) | YES  |            | NULL    |                                 |
| plan_date        | varchar(45) | YES  |            | NULL    |                                 |
| created_date   | varchar(60) | YES  |           | NULL    |                                 |
+--------------+-------------+------+-----+---------+--------------------------------------+

数据库表 food_menu结构图:

+---------------+----------------+------+---------+------------+---------------------+
| Field            | Type             | Null | Key     | Default   | Extra                    |
+---------------+----------------+------+---------+-----------+-----------------------+
| id                 | int(11)           | NO   | PRI     | NULL     | auto_increment |
| name          | varchar(45) | YES  |             | NULL    |                               |
| code           | varchar(45) | YES  |             | NULL    |                               |
| type            | varchar(45) | YES  |             | NULL    |                                |
| taste           | varchar(45) | YES  |             | NULL    |                               |
| season      | varchar(45) | YES  |             | NULL    |                                |
| rank           | int(11)           | YES  |             | NULL    |                                |
| is_active   | tinyint(1)       | YES  |             | NULL    |                                |
+-------------+-----------------+--------+--------+-----------+----------------------+

数据库表 food_menu_plan_has_food_menu结构图:

+-----------------------------+----------+-----+---------+-----------+-------+
| Field                               | Type    | Null | Key     | Default | Extra |
+-----------------------------+---------+------+----------+---------+--------+
| food_menu_plan_id   | int(11) | NO   | PRI     | NULL   |            |
| food_menu_id             | int(11) | NO   | PRI     | NULL    |            |
+-----------------------------+---------+------+---------+-----------+--------+

功能要求:

根据food_menu_plan的id值查找对应的food_menu的值。

代码:(出于方便,只写 service里的方法)

service:

 public List<FoodMenu> findByType(int id) {

    List<FoodMenu> foodMenus = null;
    final int foodMenuPlanId = id;

    foodMenus = foodMenuDAO.executeFind(new HibernateCallback() {

        @Override
        public Object doInHibernate(Session session)
            throws HibernateException, SQLException {
        List<Object[]> objects = null;
        List<FoodMenu> list = new ArrayList<FoodMenu>();

        //注意has表使用,在写HQL语句的时候,对于外健关联的字段,不应再写当前字段,应直接写对应的实体类
        Query query = session
            .createQuery(
                "from FoodMenu fm,FoodMenuPlanHasFoodMenu fhf,FoodMenuPlan fmp where fmp.id = fhf.FoodMenuPlan and fm.id = fhf.FoodMenu and fmp.id = ?")
             .setParameter(0, foodMenuPlanId);

       //通过上面HQL语句查询出来的集合,是object 类型,我们需要转换为我们需要的实体类型。

         objects = query.list();
        for (int i = 0; i < objects.size(); i++) {
            Object[] obs = objects.get(i);
            FoodMenu foodMenu = (FoodMenu) obs[0];
            list.add(foodMenu);
        }

       //解决hibernate中延迟加载的问题

         for (FoodMenu foodMenu : list) {
            Hibernate.initialize(foodMenu.getFoodMaterials());
            Hibernate.initialize(foodMenu.getFoodMenuPlans());
        }
        return list;
        }
    });

    return foodMenus;
    }

个人 写法,有更好的写法的话请告诉本人。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值