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

mrphzbgm  于 2023-08-01  发布在  Java
关注(0)|答案(2)|浏览(125)

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

{"name":"xx"}

字符串
我想使用Hibernate对该字段执行全文搜索。有什么方法可以做到这一点吗?我遵循了一些例子,但没有一个对我有效。

9bfwbjaz

9bfwbjaz1#

理想情况下,Hibernate将通过JPQL/HQL和/或Criteria查询对JSON对象内部的查询提供原生支持。目前情况似乎并非如此(5.0.1)。
看起来目前您需要使用以下方法之一来使用本机查询:

  • 使用EntityManager.createNativeQuery或其变体之一;
  • 在Map中定义一个@NamedNativeQuery,然后使用EntityManager.createNamedQuery运行它;或者是
  • 展开EntityManager,再展开下面的Session,然后使用JDBC

如果您使用的是本机Hibernate接口,而不是JPA接口,那么Map中的所有上述本机查询都有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}{}

prdp8dxp

prdp8dxp2#

我知道这是一个旧的职位,但现在你可以尝试使用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();
}

字符串

相关问题