JPA支持查询Postgres JSON字段

时间:2016-02-04 16:00:12

标签: postgresql hibernate jpa jsonb

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

像JPA这样的标准的重点是要在所有数据库供应商中都支持一组通用功能。由于对JSON字段的查询是特定于供应商的功能,在本例中为Postgres,因此很难认为它会在JPA中找到它的实现,直到它被认为是所有关系SQL数据库的标准功能为止。

答案 2 :(得分:0)

JPA本身不支持转换JSON或JSONB字段。您需要创建一个javax.persistence.AttributeConverter才能往返于JSON / JSONB。要记住的另一个重要类是org.postgresql.util.PGobject , which is useful for converting to/from jsonb`字段。

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

另一注:在创建SQLFunction时,将您用作本地函数调用或别名的json / jsonb运算符引用是有益的。包含?运算符的本机查询有一种趋势,即使正确地对其进行了转义,也很容易出错。

请参见Hibernate JavadocsJPA Javadocs