如何在JPA规范中使用mysql“ json_contains”

时间:2019-09-12 10:00:22

标签: jpa

我想使用JPA规范查询我的数据。 该列由@Type(type =“ json”)注释。 我用这些代码生成了谓词:

 cb.like(root.get<String>("exampleColumnName"), "%queryParam%")

最后,我得到了这样的sql,它无法从mysql中获取任何内容:

select * from XXX where exampleColumnName like '"%queryParam%"'

但是sql除外

select * from XXX where exampleColumnName like '%queryParam%'

我将代码跟踪到com.vladmihalcea.hibernate.type.json.internal.JsonTypeDescriptor,发现“ unwrap”方法与org.hibernate.type.descriptor.java.StringTypeDescriptor不同。

我想生成一个用@Type(type =“ json”)注释的列的LikePredicate

1 个答案:

答案 0 :(得分:0)

最后,我发现“函数”方法可以完成我想要的

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
        }