使用 Hibernate 在 PostgreSQL 中进行 JSON 键搜索

问题描述 投票:0回答:2

我有一个 JSON 字段

data
,其中包含以下数据-

{"name":"xx"}

我想使用 Hibernate 对此字段执行全文搜索。我有什么办法可以实现这个目标吗?我遵循了一些例子,但对我来说没有任何作用。

java hibernate postgresql full-text-search
2个回答
3
投票

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

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

如果您使用本机 Hibernate 接口而不是 JPA 接口,则 Hibernate 与上述所有接口等效 - 在映射中命名本机查询,通过

Session
对象创建本机查询,或展开
Session
以获得
 java.sql.Connection

在所有这些情况下,您需要使用 PostgreSQL 特定的运算符,例如

?
->>
来查询 json 和常规 SQL,而不是 JPQL/HQL。请参阅postgresql json 运算符。请注意,JSON 功能是在 9.3 中引入的,并在 9.4 和 9.5 中得到增强,因此请检查您的版本是否具有您需要的功能。

例如,您可以在 9.4+ 中将

myjsoncolumn ? 'key'
jsonb
一起使用。对于普通的
json
类型,您需要使用
(myjsoncolumn -> 'key') IS NULL
。使用
->
而不是
->>
很重要,因为对于像
->
这样的对象,
{"a":null}
返回一个json空对象,另一个返回
NULL
,所以你无法区分
{"a":null}
{}之间的区别
.


0
投票

我知道这是一篇旧文章,但现在你可以尝试使用 posjsonhelper 项目

例如:

public List<Item> findAllByStringValueAndLikeOperator(String expression) {
    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<Item> query = cb.createQuery(Item.class);
    Root<Item> root = query.from(Item.class);
    query.select(root);
    query.where(cb.like(new JsonBExtractPathText((CriteriaBuilderImpl) cb, singletonList("string_value"), root.get("jsonbContent")), expression));
    return entityManager.createQuery(query).getResultList();
}
© www.soinside.com 2019 - 2024. All rights reserved.