JPA CriteriaBuilder 中的自定义表达式

Posted

技术标签:

【中文标题】JPA CriteriaBuilder 中的自定义表达式【英文标题】:Custom expression in JPA CriteriaBuilder 【发布时间】:2016-12-09 04:38:23 【问题描述】:

我有一个带有字符串字段(存储 JSON)的实体,并且需要将其数据库列中的值与另一个值进行比较。问题是这个数据库列的类型是 TEXT,但实际上它包含 JSON。那么,有没有办法写出这样的东西? IE。我需要将我的值与 TEXT 列中的一些 JSON 字段进行比较。

criteriaBuilder.equal(root.get("json_column").customExpressionn(new Expression
   Object handle(Object data)
    return ((Object)data).get("json_field")

), value)

【问题讨论】:

使用 CAST?使用函数? @NeilStockton,你的意思是调用 sql 函数,它解析 JSON 并返回我的字段?我希望找到一些 CriteriaAPI 解决方案。 @NeilStockton,我的实体?它有什么帮助?我的实体只有 String 字段,其中包含 JSON。 我不知道你想达到什么目标。您有一个存储字符串值的字符串字段,存储在 TEXT 列中,并希望将其与某个值进行比较。您不需要任何自定义处理程序,只需执行“equal()”即可。如果您想要比较文本字符串的某些部分......那么您将给出数据存储中的文本字符串的示例以及您想要比较的部分 @NeilStockton,这里是这个字符串的一个例子:"field1: \"value\",field2: \"value2\""。我需要将我的一些字符串与 field2 的值进行比较。 【参考方案1】:

假设您的 MySQL 服务器版本 > 5.7.x

我也遇到了同样的问题。我想在 JSON 对象列中查找具有 JSON 字段值的类的所有实体。

对我有用的解决方案大致是这样的(抱歉用手机打字)

(root, query, builder)->
    return builder.equal(
        builder.function("JSON_EXTRACT", String.class, root.get("myEntityJsonAttribute"), builder.literal("$.json.path.to.json.field")),
        "searchedValueInJsonFieldOfJsonAttribute"
    )

【讨论】:

嗨,发现你的帖子很有用,你能帮我用标准构建以下查询吗,就像你在上面分享的那样? SELECT * FROM audit_log WHERE JSON_CONTAINS_PATH(myEntityJsonAttribute 'one', "$.json.path.to.json.field");

以上是关于JPA CriteriaBuilder 中的自定义表达式的主要内容,如果未能解决你的问题,请参考以下文章

JPA CriteriaBuilder - 表达式 <List>

java-jpa-criteriaBuilder使用入门

JPA / Hibernate:CriteriaBuilder - 如何使用关系对象创建查询?

在相同的事务方法中使用 CriteriaBuilder JPA 插入和更新错误“外键不存在”

真正动态的 JPA CriteriaBuilder

如何告诉 JPA CriteriaBuilder 按返回的唯一数据列排序?