我有一个 JSON 字段
data
,其中包含以下数据-
{"name":"xx"}
我想使用 Hibernate 对此字段执行全文搜索。我有什么办法可以实现这个目标吗?我遵循了一些例子,但对我来说没有任何作用。
理想情况下,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 运算符。请注意,JSON 功能是在 9.3 中引入的,并在 9.4 和 9.5 中得到增强,因此请检查您的版本是否具有您需要的功能。
例如,您可以在 9.4+ 中将
myjsoncolumn ? 'key'
与 jsonb
一起使用。对于普通的 json
类型,您需要使用 (myjsoncolumn -> 'key') IS NULL
。使用->
而不是->>
很重要,因为对于像->
这样的对象,{"a":null}
返回一个json空对象,另一个返回NULL
,所以你无法区分{"a":null}
和{}
之间的区别
.
我知道这是一篇旧文章,但现在你可以尝试使用 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();
}