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

环境

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方便。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山鬼谣me

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值