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

  • Post author:
  • Post category:mysql


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方法



版权声明:本文为u010234516原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。