在使用Hibernate时,如何在PostgreSQL中进行JSON键搜索?

5

我有一个JSON字段data,其中包含以下数据-

{"name":"xx"}

我想使用Hibernate对该字段进行全文搜索。有没有办法可以实现这个功能?我尝试了一些例子,但都没成功。


1
你尝试过使用Hibernate原生SQL查询吗? - naXa stands with Ukraine
2
我不同意关闭投票,这既不是过于宽泛也不是离题的。这是完全合理的。 - Craig Ringer
1个回答

3
理想情况下,Hibernate应该原生支持通过JPQL/HQL和/或Criteria查询在JSON对象内部进行查询。但目前似乎不是这种情况(5.0.1)。看起来,目前您需要使用以下方法之一使用本机查询: - 使用EntityManager.createNativeQuery或其变体; - 在映射中定义@NamedNativeQuery,然后使用EntityManager.createNamedQuery运行它; 或者 - 拆开EntityManager,拆开下面的Session,并使用JDBC。
如果您使用的是原生Hibernate接口而不是JPA接口,则所有上述内容都有Hibernate等效项 - 在映射中命名本地查询、通过Session对象创建本地查询,或展开Session以获取java.sql.Connection
在所有这些情况下,您将需要使用PostgreSQL特定的运算符,例如用于查询JSON和常规SQL的?->>,而不是JPQL/HQL。请参见postgresql json operators。请注意,JSON功能是在9.3中引入的,并在9.4和9.5中得到增强,因此请检查您的版本是否具有所需的功能。
例如,您可以在9.4+中使用jsonbmyjsoncolumn ? 'key'。对于普通的json类型,您需要使用(myjsoncolumn -> 'key') IS NULL。重要的是要使用->而不是->>,因为->返回一个json空对象,例如{"a":null},而另一个返回NULL,所以您无法区分{"a":null}{}

谢谢,这就是我想知道的。我只是想澄清除了EntityManager.createNativeQuery之外没有其他办法。谢谢。 - Justin
@Justin,您可以在映射中创建一个已命名的本地查询,然后使用“createNamedQuery”稍后运行它。这样,如果/当Hibernate添加了用于在JSON对象中进行查询的JPQL/HQL支持时,您可以随后将“@NamedNativeQuery”更改为普通的“@NamedQuery”。除非要执行大量动态SQL,否则这可能是我会做的事情。 - Craig Ringer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接