简单强大的HqlHelper

让我们可以通过链式操作,自然语言的顺序去操作数据库,不关心数据库的语法

初始化

// 初始化一个新的HqlHelper,fromClazz = Admin.class
HqlHelper helper = HqlHelper.queryFrom(Admin.class);

// 重新初始化helper,fromClazz = Right.class
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

    @Autowired
    private HqlHelperService helperService;

    @Test
    public void testHql() {
        // 一个基本的查询例子 - 查询单个
        // 查询id=1160799039167057920 的城市名称以及归属的省份名称
        HqlHelper helper = HqlHelper.queryFrom(City.class);
        helper.fetch("name")
              .join(HqlHelper.currTable, "province", "p").fetchWithTable("p", "name", "provinceName")
              .eq("id", "1160799039167057920");
        Record oneCity = helperService.getRecord(helper);
        System.err.println("oneCity=" + oneCity);

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

        // 一个基本的更新例子
        // 将id=1160799039167057920 的城市名称更新为`新名称`
        // 并且,将sortSeq字段加1
        helper.resetQueryFrom(City.class)
              .update("name", "新名称")
              .updateHqlSegment("sortSeq", "sortSeq + 1")
              .eq("id", "1160799039167057920");
        int updateRow = helperService.update(helper);
        System.err.println("updateRow =" + updateRow);

        // 一个基本的删除例子
        //将name以「测试」开头的城市都删除掉
        helper.resetQueryFrom(City.class)
              .like("name", "测试", MatchType.START);
        int deleteRow = helperService.delete(helper);
        System.err.println("deleteRow =" + deleteRow);

        // 一个基本的分组查询例子
        // 查询每个省份下的城市数量和最大的区号,返回城市数量 between 2 and 5 的数据
        helper.resetQueryFrom(City.class)
        .join(HqlHelper.currTable, "province", "p")
        .groupBy("p", "name", "provinceName")
        .count("id", "cityCount").having_between(2L, 5L)
        .max("areaCode", "maxAreaCode");
        Records provinceCityCount = helperService.getRecordsGroup(helper);
        System.err.println("provinceCityCount =" + provinceCityCount);
    }
//执行结果:
oneCity=Record [rawData={name=新名称, provinceName=福建}]
cityList=Records [rawData=[
      {name=新名称, provinceName=福建}, 
      {name=莆田市, provinceName=福建}]]
updateRow =1
deleteRow =0
provinceCityCount =Records [rawData=[
      {maxAreaCode=0955, provinceName=宁夏, cityCount=5}, 
      {maxAreaCode=0898, provinceName=海南, cityCount=3}]]

彩蛋

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

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

开始学习

Copyright © DodoFramework 2020 all right reservedModify At: 2022-05-30 19:03:53