Hibernate多表关联查询记录映射

通常情况下,单表的查询比较简单,在hibernate中可以将查询记录直接映射到具体的实体类,因为通常会通过JPA注解将数据表和实体类建立映射关系,在查询数据,保存数据时,可以直接操作java实体类,但是涉及到多表查询,查询的多条记录,如果也要和java的类建立关系映射,需要做一些处理。

hibernate查询支持多种,如使用基本实体类对象查询,HQL查询,QBC(Query By Criteria)以及原生sql语句查询

我个人在复杂查询时候还是喜欢用原生sql查询,因为HQL查询,操作的是实体类对象,感觉不方便,原生sql语句,我可以直接在Navicat中书写好,执行一遍,然后复制到java语句中,出错概率小,而且查询语句还可以借助Navicat的查询编辑器来写

比如,今天有一个需求,需要查询出订单列表信息,所需信息需要从三个表中查询出来

三个表连接查询,写出的语句,直接可以复制到java语句中

三个表中的数据查询出来,但是并没有具体的实体类(与数据表字段一 一 对应的关系的类),所以我创建了一个dto类,可以看到是HotelOrderListDto,查询出来的多条记录用List保存,类型是HotelOrderListDto

但是注意,查询出来的字段名称需要设置别名,因为数据表中的字段是带下划线方式,而我创建的java的dto类是驼峰命名的,所以并不能直接对应上,所以在sql语句中为每个字段设置了别名,与HotelOrderListDto类的属性名称相同。同事在建表tmc_hotel_info时候,hotel_id用的bigint类型,我在HotelOrderListDto这个类中设置hotelId时候,试了Integer和Long都不行,Hibernate会提示异常类型不匹配,会提示需要integer类型,但是实际上是BigInteger类型,使用Long也是,还是会提示需要Long类型,但实际是BigInteger(数据表中的字段类型,查询之后需要映射给这个类的hotelId属性),所以最后设为math包下的BigInteger类型,可以成功将查询出来的hotel_id值映射给HotelOrderListDto的hotelId

然后还有一步比较关键,就是

     // 执行分页查询
 Query query = session.createSQLQuery(sql).setString("ucode", ucode).setFirstResult(firstResult).setMaxResults(pageSize);
//        查询结果映射给HotelOrderListDto对象
        List<HotelOrderListDto>  hotelOrderListDtos = query.setResultTransformer(Transformers.aliasToBean(HotelOrderListDto.class)).list();

 使用这个方法,将查询结果传递到HotelOrderListDto类中,然后就可以将List<HotelOrderListDto> 对象,遍历出来,放到json数组中,然后添加到JsonObject中返回给前端,这是service层

    @Override
    @Transactional
    public JSONObject hotelOrderList(Integer pageNum, Integer pageSize, String ucode) {
        List<HotelOrderListDto> hotelOrderListDtos = hotelOrderListDao.hotelOrderList(pageNum, pageSize, ucode);
        LOGGER.info("订单列表返回数据:" + hotelOrderListDtos.toString());
        JSONArray jsonArray = new JSONArray();
        for (HotelOrderListDto hotelOrderListDto
                : hotelOrderListDtos
        ) {
            jsonArray.add(hotelOrderListDto);

        }
        JSONObject hotelOrderListDtosJsonObject = new JSONObject();
        hotelOrderListDtosJsonObject.put("hotelOrderList", jsonArray);
        LOGGER.info("hotelOrderListDtosJsonObject:"+hotelOrderListDtosJsonObject.toJSONString());

        return hotelOrderListDtosJsonObject;
    }

然后在postman中测试,就可以返回json数据

   @PostMapping(params = "hotelOrderList")
    public AjaxJson hotelOrderList(@RequestBody HotelOrderListRequest hotelOrderListRequest) {

        AjaxJson json = new AjaxJson();
        if (hotelOrderListRequest == null) {
            json.setSuccess(false);
            json.setMsg("参数为空");
            return json;
        }
        Integer pageNum = hotelOrderListRequest.getPageNum();
        Integer pageSize = hotelOrderListRequest.getPageSize();
        String ucode = hotelOrderListRequest.getUcode();
        JSONObject responseJsonObject = hotelOrderListService.hotelOrderList(pageNum, pageSize, ucode);
        json.setObj(responseJsonObject);


        return json;
    }

Hibernate用的还是不熟,虽然现在很少有公司用这个ORM框架了,但是现在公司的这个项目在用,就还是要好好熟悉,多多总结一下吧!

  • 1
    点赞
  • 4
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:技术黑板 设计师:CSDN官方博客 返回首页
评论

打赏作者

xiaomifeng1010

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值