环境

JOOQ: “3.9.6”
java:1.8
springboot:1.5.10.RELEASE

前言

最近进小黑屋赶项目;

公司封装的分页方法,字段接收上,不能满足我,所以我就自己写了一个,
顺便了解了解JOOQ的写法。

具体需求是个很简单的查询,传入页码、排序字段后,指定一个DTO类型来接收返回的字段。

代码

方法签名:
DAO层面的方法:

public Pagination<T> findItemDTOPage(Pageable pageable, List<Condition> conditions)

其中Pageable是springboot包下的org.springframework.data.domain;用于Controller接收分页参数的。

第二个参数List<Condition> conditionsConditionJOOQ包下的:org.jooq

简单查询

比如现在查询第一页的数据,每页显示10条。
前端传的参数就是:page=0,size=10
默认排序是created倒序;

如图,方法第二个参数使用了@PageableDefault注解来指定默认排序。pageable来接收page、size和sort字段

那么DAO层的方法如下:

public Pagination<PurchaseRequestItemDTO> findItemDTOPage(Pageable pageable, List<Condition> prItemCondition) {// 组装排序字段
List<SortField<?>> sortFields = Lists.newArrayList();
// pageable来自springboot包
Sort sort = pageable.getSort();
// 从这里可以看出,支持多字段排序
// 但是多字段排序方向是一个方向 要么升序,要么降序
sort.forEach(order -> {String property = order.getProperty();Field<?> field = PURCHASE_REQUEST_ITEM.field(property);if (field != null) {// Sort.Direction.ASC是JOOQ的// order.getDirection()是springboot的SortOrder sortOrder = order.getDirection() == Sort.Direction.ASC ? SortOrder.ASC : SortOrder.DESC;SortField<?> sortField = field.sort(sortOrder);sortFields.add(sortField);}
});List<PurchaseRequestItemDTO> purchaseRequestItemDTOS =dsl.select(PURCHASE_REQUEST.fields()).select(PURCHASE_REQUEST_ITEM.fields()).select(PURCHASE_REQUEST.field(PURCHASE_REQUEST.ID).as("purchaseRequestId"),PURCHASE_REQUEST_ITEM.field(PURCHASE_REQUEST.AUDITOR).as("approver"),PURCHASE_REQUEST.field(PURCHASE_REQUEST.CREATED).as("purchaseRequestCreated")).from(PURCHASE_REQUEST_ITEM.innerJoin(PURCHASE_REQUEST).on(PURCHASE_REQUEST.ID.eq(PURCHASE_REQUEST_ITEM.PURCHASE_REQUEST_ID))).where(prItemCondition).orderBy(sortFields).limit(pageable.getOffset(), pageable.getPageSize()).fetchInto(PurchaseRequestItemDTO.class);
// Pagination公司封装的返回前端的分页类
Pagination<PurchaseRequestItemDTO> pagination = new Pagination<>();
pagination.setContent(purchaseRequestItemDTOS);
pagination.setPage(pageable.getPageNumber());
pagination.setSize(pageable.getPageSize());
return pagination;
}

分析:
1、PURCHASE_REQUEST.fields()获取该表的所有字段。
2、PURCHASE_REQUEST.field(PURCHASE_REQUEST.ID).as("purchaseRequestId")字段重命名;这样写太啰嗦了,也可以:

PURCHASE_REQUEST.ID.as("purchaseRequestId")

3、where()方法有很多重载方法,支持集合、数组,字段,SQL等查询,具体可以看源码;
4、orderBy()方法,也有多种重载方法。
5、limit()第一个参数偏移量,第二个参数是每次偏移的数量。
6、fetchInto()这个方法参数是指定模型类,来接收查询出来的字段数据。
如果是关联查询,比如上面的代码,我使用的是自定义DTO类来接收的。

公司里使用某个表类(JOOQ自动生成的表类)来接收,这样会导致另一张表的字段没办法获取。所以自定义好些。

总结

熟悉JOOQ后,感觉比mybatis方便。

JOOQ学习笔记:分页、排序、字段重命名的写法相关推荐

  1. ElasticSearch 6.x 学习笔记:12.字段类型

    ElasticSearch 6.x 学习笔记:12.字段类型 欢迎转载. https://blog.csdn.net/chengyuqiang/article/details/79048800 12. ...

  2. Java 对象转Json,@JSONField对象字段重命名和顺序问题

    一.引入maven依赖 <dependency><groupId>com.alibaba</groupId><artifactId>fastjson&l ...

  3. 【C#编程基础学习笔记】6---变量的命名

    2013/7/24 技术qq交流群:JavaDream:251572072  教程下载,在线交流:创梦IT社区:www.credream.com [C#编程基础学习笔记]6---变量的命名 ----- ...

  4. Python 学习笔记 列表 排序 xxx XXX

    Python 学习笔记 列表 排序 xxx XXX print("-" * 30) cars = ['bmw', 'audi', 'toyota', 'subaru'] cars. ...

  5. mysql字段重命名_MySQL中使用SQL语句对字段进行重命名

    MySQL中,如何使用SQL语句来对表中某一个字段进行重命名呢?我们将使用alter table 这一SQL语句. 重命名字段的语法为:alter table change . 现在我们来尝试把tes ...

  6. Python学习笔记:通过Headers字段模拟浏览器访问亚马逊界面爬取

    学习笔记:哔哩哔哩 Python 爬虫视频教程全集(62P)| 6 小时从入门到精通 0. 学习视频地址 https://www.bilibili.com/video/BV1pt41137qK?p=1 ...

  7. oracle 字段重命名大表,Oracle表字段的增、刪、改、表的重命名及主鍵的增、刪、改...

    一.表字段的增刪改: 添加字段的語法:alter table tablename add (column datatype [default value][null/not null],-.); 修改 ...

  8. soapUI学习笔记--用例字段参数化

    字段参数化的简单操作 1.把Request新增一个TestCase 增加TestCase,下方会出现: 2.案例中,请求参数只有一个.先运行下请求,可以运行成功(保证接口是通的) 3.添加参数.见图中 ...

  9. 31 天重构学习笔记5. 提升字段

    摘要:由于最近在做重构的项目,所以对重构又重新进行了一遍学习和整理,对31天重构最早接触是在2009年10月份,由于当时没有订阅Sean Chambers的blog,所以是在国外的社区上闲逛的时候链接 ...

最新文章

  1. 程序员最害怕的5件事,你中招了吗?
  2. 绝地求生自定义服务器租一天多少钱,绝地求生自定义服务器怎么样?绝地求生自定义服务器使用攻略...
  3. php中is_int用法,php – is_int()和ctype_digit()之间有区别吗?
  4. ceph rgw java_ceph rgw multisite基本用法
  5. vs cpp生成h文件_lib 和 dll 的区别、生成以及使用详解
  6. [Alpha]Scrum Meeting#5
  7. Linux多线程工作笔记0003---C语言中%p,%u,%lu都有什么用处
  8. java-cef系列视频第二集:搭建开发环境
  9. 使用rem单位布局的时候有什么好处_好程序员web前端技术分享移动端页面布局
  10. 植被指数-RVI、NDVI、DVIEVI、GVI、PVI、EVI
  11. latex----目录格式设置
  12. asp二进制mysql_asp 二进制保存数据库
  13. 雅思两次7.5经验分享~希望帮你冲击雅思高分!
  14. 教你如何试用华为云服务器
  15. Iqoo手机删除内置应用
  16. 2021年“上海区块链周”参会随感(二)2021-04-12
  17. 停电让服务器自动关机,服务器断网/断电自动关机小工具 断网/断电5分钟后自动关机...
  18. ASEMI整流桥KBJ610,KBJ610浪涌电流,KBJ610反向电流
  19. 一些vue功能和css样式
  20. 程序媛是怎样找老公的(2017版)

热门文章

  1. 对DestoryWindow的解释.
  2. ISO26262对软件开发的规定
  3. 国外可以发外链的网站,外贸网站外链平台
  4. 测试小故事6:术业有专攻
  5. Pytorch中的repeat以及repeat_interleave用法
  6. uni-app H5 上传图片
  7. 八数码(Eight Digits)问题:宽度优先搜索、全局择优搜索、A*算法(C语言实现)
  8. 主机地址、网络地址、主机路由、网络路由
  9. 今天公开猎头顾问业绩过百万的秘密,谷露猎头系统3.0版谍报速递
  10. 零基础数据挖掘入门系列(三) - 数据清洗和转换技巧