简单强大的HqlHelper

初始化

  1. // 初始化一个新的HqlHelper,fromClazz = Admin.class
  2. HqlHelper helper = HqlHelper.queryFrom(Admin.class);
  3. // 重新初始化helper,fromClazz = Right.class
  4. helper.resetQueryFrom(Right.class);

使用

第一步:初始化HqlHelper helper

第二步:将helper作为参数,调用HqlHelperService、XXXXService相关方法进行操作数据库

具体用法参见:com.dodo.common.framework.service.HqlHelperService 代码注释
具体用法参见:com.dodo.common.framework.service.BaseService 代码注释

第三步:读取返回结果

示例:配置HqlHelper并操作数据库

测试源码:/dodo/src/test/java/com/dodo/testing/tests/hqltest/HqlHelperTest.java

  1. @Autowired
  2. private HqlHelperService helperService;
  3. @Test
  4. public void testHql() {
  5. // 一个基本的查询例子 - 查询单个
  6. // 查询id=1160799039167057920 的城市名称以及归属的省份名称
  7. HqlHelper helper = HqlHelper.queryFrom(City.class);
  8. helper.fetch("name")
  9. .join(HqlHelper.currTable, "province", "p").fetchOther("p", "name", "provinceName")
  10. .eq("id", "1160799039167057920");
  11. Record oneCity = helperService.getRecord(helper);
  12. System.err.println("oneCity=" + oneCity);
  13. // 一个基本的查询例子 - 查询列表
  14. // 查询所有城市名称以及归属的省份名称,返回2条记录
  15. helper.resetQueryFrom(City.class).fetch("name")
  16. .join(HqlHelper.currTable, "province", "p").fetchOther("p", "name", "provinceName")
  17. .setFirstResult(0).setMaxResults(2);
  18. Records cityList = helperService.getRecords(helper, false);
  19. System.err.println("cityList=" + cityList);
  20. // 一个基本的更新例子
  21. // 将id=1160799039167057920 的城市名称更新为`新名称`
  22. // 并且,将sortSeq字段加1
  23. helper.resetQueryFrom(City.class)
  24. .update("name", "新名称")
  25. .updateHqlSegment("sortSeq", "sortSeq + 1")
  26. .eq("id", "1160799039167057920");
  27. int updateRow = helperService.update(helper);
  28. System.err.println("updateRow =" + updateRow);
  29. // 一个基本的删除例子
  30. //将name以「测试」开头的城市都删除掉
  31. helper.resetQueryFrom(City.class)
  32. .like("name", "测试", MatchType.START);
  33. int deleteRow = helperService.delete(helper);
  34. System.err.println("deleteRow =" + deleteRow);
  35. // 一个基本的分组查询例子
  36. // 查询每个省份下的城市数量和最大的区号,返回城市数量 between 2 and 5 的数据
  37. helper.resetQueryFrom(City.class)
  38. .join(HqlHelper.currTable, "province", "p")
  39. .groupByOther("p", "name", "provinceName")
  40. .count("id", "cityCount").having_between(2L, 5L)
  41. .max("areaCode", "maxAreaCode");
  42. Records provinceCityCount = helperService.getRecordsGroup(helper);
  43. System.err.println("provinceCityCount =" + provinceCityCount);
  44. }
  1. //执行结果:
  2. oneCity=Record [rawData={name=新名称, provinceName=福建}]
  3. cityList=Records [rawData=[
  4. {name=新名称, provinceName=福建},
  5. {name=莆田市, provinceName=福建}]]
  6. updateRow =1
  7. deleteRow =0
  8. provinceCityCount =Records [rawData=[
  9. {maxAreaCode=0955, provinceName=宁夏, cityCount=5},
  10. {maxAreaCode=0898, provinceName=海南, cityCount=3}]]

彩蛋

上述示例中的 province name areaCode 等字段名可以使用模型静态字段类 来引用,如果都这样做了,那么好处显而易见:以后删除或者修改实体类的字段,重新生成代码后,引用的该字段的代码将报错,逐一修改即可,效率非常高。如:

  1. // 一个基本的查询例子 - 查询列表
  2. // 查询所有城市名称以及归属的省份名称,返回2条记录
  3. helper.resetQueryFrom(City.class)
  4. .fetch(CityFields.name)
  5. .join(HqlHelper.currTable, CityFields.province, "p")
  6. .fetchOther("p", ProvinceFields.name, "provinceName")
  7. .setFirstResult(0).setMaxResults(2);
  8. Records cityList = helperService.getRecords(helper, false);
  9. System.err.println("cityList=" + cityList);

开始学习