我有一个JSON字段data,其中包含以下数据-
data
{"name":"xx"}
字符串我想使用Hibernate对该字段执行全文搜索。有什么方法可以做到这一点吗?我遵循了一些例子,但没有一个对我有效。
9bfwbjaz1#
理想情况下,Hibernate将通过JPQL/HQL和/或Criteria查询对JSON对象内部的查询提供原生支持。目前情况似乎并非如此(5.0.1)。看起来目前您需要使用以下方法之一来使用本机查询:
EntityManager.createNativeQuery
@NamedNativeQuery
EntityManager.createNamedQuery
EntityManager
Session
如果您使用的是本机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}和{}。
java.sql.Connection
?
->>
myjsoncolumn ? 'key'
jsonb
json
(myjsoncolumn -> 'key') IS NULL
->
{"a":null}
NULL
{}
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(); }
字符串
2条答案
按热度按时间9bfwbjaz1#
理想情况下,Hibernate将通过JPQL/HQL和/或Criteria查询对JSON对象内部的查询提供原生支持。目前情况似乎并非如此(5.0.1)。
看起来目前您需要使用以下方法之一来使用本机查询:
EntityManager.createNativeQuery
或其变体之一;@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}
和{}
。prdp8dxp2#
我知道这是一个旧的职位,但现在你可以尝试使用posjsonhelper项目
举例来说:
字符串