Postgresql JPA支持查询Postgres JSON字段

Postgresql JPA支持查询Postgres JSON字段,postgresql,hibernate,jpa,jsonb,Postgresql,Hibernate,Jpa,Jsonb,JPA中是否已经支持处理JSON字段上的查询,如下所示: select * from person where (info ->> 'age')::numeric = 40; select * from person where info ->> 'firstName'= 'Cabalo'; 我正在使用hibernate 5(在spring数据jpa之后)和Postgres 9.4,因为jpa中不支持“JSON”字段,所以不支持查询它们。JPA允许用户使用SQL,因此

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

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

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

我正在使用hibernate 5(在spring数据jpa之后)和Postgres 9.4,因为jpa中不支持“JSON”字段,所以不支持查询它们。JPA允许用户使用SQL,因此可以使用非常特定的列类型以及关联的查询方法。这就是特定于RDBMS的。无法想象这会出现在任何JPA规范中,但是JPA供应商可以作为供应商扩展来支持这一点。像JPA这样的标准的要点是在所有DB供应商中都支持一组通用的功能。由于查询JSON字段是一种特定于供应商的功能,在本例中是Postgres,因此很难期望它在JPA中找到它的实现,除非它被认为是所有关系SQL数据库的标准功能。

JPA本机不支持转换JSON或JSONB字段。您将需要创建一个
javax.persistence.AttributeConverter
,以便与JSON/JSONB进行通信。另一个需要记住的重要类是
org.postgresql.util.PGobject
,用于转换为
jsonb`字段或从中转换

第二,JPA只是一个API。为了充分利用这种类型,您需要自定义底层实现。为了使用JSON/JSONB函数,您需要创建
org.hibernate.dial.function.SQLFunction
。您需要在
org.hibernate.dialogue.postgresql95dialogue
中注册此属性以及创建的
AttributeConverter
类型

另一个注意事项:在创建
SQLFunction
时,将json/jsonb操作符用作本机函数调用或别名可能是有益的。即使正确转义了
运算符,包含该运算符的本机查询也有被损坏的趋势


请参阅和。

JPA不支持这些东西,正如JPA规范的快速修订版或任何实现文档所说的那样。某些特定RDBMS中的某些特定类型可能永远不会被标准化,因为它只是。。。具体地说,我发现这个源代码是基于eclipselink:,但它在hibernate.errm上不起作用。是的,正如我所说,它不是标准的。因此,它可以在1个提供程序上工作,但不能在任何其他提供程序上工作。因此,您不能依赖它来实现便携式应用程序。此处添加了概念验证项目:如果其他人对此主题感兴趣。如果您使用Hibernate作为JPA实现,您可能需要阅读。