JPA 支持查询 Postgres JSON 字段

Posted

技术标签:

【中文标题】JPA 支持查询 Postgres JSON 字段【英文标题】:JPA support for querying Postgres JSON fields 【发布时间】:2016-05-14 08:11:54 【问题描述】:

JPA 中是否已经支持处理 JSON 字段的查询,如下所示:

select * from person where (info ->> 'age')::numeric = 40;

select * from person where info ->> 'firstName'= 'Cabalo';

我正在使用 hibernate 5(在 spring-data-jpa 之后)和 Postgres 9.4

【问题讨论】:

JPA 不支持这样的事情,正如 JPA 规范的快速修订或任何实现文档所说的那样。某些特定 RDBMS 中的某些特定类型可能永远不会被标准化,因为它只是……特定的 我找到了这个基于eclipselink的源代码:github.com/sasa7812/psql-cache-evict-POC/blob/master/src/test/…,但是在hibernate上不起作用。 errm 是的,正如我所说,这不是标准的。因此它可能适用于 1 个提供商,但不适用于任何其他提供商。所以你不能依赖它来开发便携式应用程序。 此处添加了概念证明项目:github.com/mariusneo/postgres-json-jpa 如果其他人对此主题感兴趣。 如果您使用 Hibernate 作为您的 JPA 实现,您可能需要阅读 How to map JSON objects using generic Hibernate Types。 【参考方案1】:

由于在 JPA 中没有对“JSON”字段的 JPA 支持,因此不支持查询它们。 JPA 允许用户使用 SQL,因此可以使用非常特定的列类型,以及相关的查询方法。那是特定于 RDBMS 的。无法想象这会出现在任何 JPA 规范中,但可以由 JPA 提供者作为供应商扩展来支持

【讨论】:

【参考方案2】:

像 JPA 这样的标准的重点是拥有一套通用的功能集,所有数据库供应商都支持。由于查询 JSON 字段是一个特定于供应商的功能,在这种情况下是 Postgres,很难期望它在 JPA 中找到它的实现,直到它被认为是所有关系 SQL 数据库的标准功能。

【讨论】:

【参考方案3】:

JPA 本身不支持转换 JSON 或 JSONB 字段。您将需要创建一个javax.persistence.AttributeConverter 以便与 JSON/JSONB 往来。另一个要记住的重要类是org.postgresql.util.PGobject , which is useful for converting to/fromjsonb` 字段。

其次,JPA 只是一个 API。您将需要自定义您的底层实现以充分利用这种类型。您需要创建 org.hibernate.dialect.function.SQLFunction 才能使用 JSON/JSONB 函数。您需要在 org.hibernate.dialect.PostgreSQL95Dialect 中将其与您创建的 AttributeConverter 类型一起注册。

另一个注意事项:在创建 SQLFunction 时,将您使用的 json/jsonb 运算符作为本机函数调用或别名引用可能会有所帮助。包含? 运算符的本机查询往往会被破坏,即使它被正确转义。

请参阅 Hibernate Javadocs 和 JPA Javadocs。

【讨论】:

以上是关于JPA 支持查询 Postgres JSON 字段的主要内容,如果未能解决你的问题,请参考以下文章

如何在pojo中用jpa或hibernate映射json字段?

如何根据postgres的jsonb列的where条件(无本机查询)使用jpa在spring boot中选择数据?

Postgres 9.5 - 查询嵌套 JSON 元素的数组长度

使用 Spring / JPA 写入 Postgres 数据库的 JSON 列

如何在 Spring Boot JPA 中按 Postgres 的 json 属性排序?

如何修改postgres数据库中的json字段