JPA的Specification中使用mysql5.7之后的JSON相关函数

mysql5.7之后有了对json的支持,也提供了一些JSON相关的函数,详情参考官方文档

JPA的Predicate、Specification等类提供了以面向对象的方式来写sql查询条件的功能。
JpaSpecificationExecutor中有很多方法可以接收Specification对象。
下面是一个根据查询参数生成Specification的方法,kotlin版。
这里用mysql中的“JSON_CONTAINS”方法举例,其他方法可以举一反三。
其中area是一个地区编码字符串,areaCodeList是商品表中字段,表示本商品在areaCodeList中的这些地区可销售。

fun spec(queryForm: QueryForm): Specification<Product> {
        return Specification { root, _, cb ->
            val predicate = cb.conjunction()
            val expressions = predicate.expressions

            if (!queryForm.areaCode.isNullOrBlank()) {
                expressions.add(
                    cb.equal(
                        cb.function(
                            "JSON_CONTAINS",
                            String::class.java,
                            root.get<String>("areaCodeList"),
                            cb.literal(jacksonObjectMapper().writeValueAsString(arrayOf(queryForm.areaCode))),
                            cb.literal('$')
                        ), "1"
                    )
                )
            }
            predicate
        }
    }

可以看到重点是CriteriaBuilder的function方法,贼好用,除了上面提到的JSON相关的函数,也可以自己拼出其他函数,有空我再写一篇专门讲讲这个function方法

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值