通常情况下,单表的查询比较简单,在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框架了,但是现在公司的这个项目在用,就还是要好好熟悉,多多总结一下吧!