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 版权协议,转载请附上原文出处链接和本声明。