【问题标题】:JSON key search in PostgreSQL using Hibernate使用 Hibernate 在 PostgreSQL 中进行 JSON 键搜索
【发布时间】:2015-09-14 06:50:52
【问题描述】:

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

{"name":"xx"}

我想使用 Hibernate 对此字段执行全文搜索。有什么办法可以做到这一点?我遵循了一些示例,但对我没有任何帮助。

【问题讨论】:

  • 你尝试过 Hibernate 原生 SQL 查询吗?
  • 我不同意近距离投票,这既不是过于宽泛也不是离题。这是完全明智的。

标签: java hibernate postgresql full-text-search


【解决方案1】:

理想情况下,Hibernate 将原生支持通过 JPQL/HQL 和/或 Criteria 查询在 JSON 对象内进行查询。目前(5.0.1)似乎并非如此。

目前您似乎需要使用以下方法之一使用本机查询:

如果您使用的是本地 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+ 中使用 myjsoncolumn ? 'key'jsonb。对于普通的json 类型,您需要使用(myjsoncolumn -> 'key') IS NULL。使用-> 而不是->> 很重要,因为->{"a":null} 之类的对象返回一个json null 对象,另一个返回NULL,因此您无法分辨{"a":null} 和@987654344 之间的区别@。

【讨论】:

  • 谢谢,这是我想知道的。我只是想明确一点,除了 EntityManager.createNativeQuery 没有其他方法。谢谢
  • @Justin 您可以在映射中创建一个命名的本机查询,然后稍后使用createNamedQuery 运行它。这样,如果/当 Hibernate 添加 JPQL/HQL 支持以在 JSON 对象中查询时,您可以稍后将 @NamedNativeQuery 更改为普通的 @NamedQuery。除非我在执行大量动态 SQL,否则我可能会这样做。
猜你喜欢
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
  • 1970-01-01
  • 2017-08-31
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
相关资源
最近更新 更多