如何在 Postgresql JSON 中使用 Hibernate Criteria 进行搜索并与 Lateral 一起使用
How use Hibernate Criteria with searching in Postgresql JSON and use with Lateral
在客户端,我们有用于使用过滤器进行搜索的端点。
在后端,我有在 Postgresql 数据库中搜索的方法。选项之一 - 搜索 jsonb 字段。
在这一天之前,我搜索了 values 和 keys。我的代码是:
if (appFilter.getSearchValue() != null) {
criteria.add(Restrictions.sqlRestriction("UPPER(values::text) LIKE '%" + appFilter.getSearchValue().toUpperCase() + "%'"));
}
SQL 模拟(UPPER
- 不是强制性的):
SELECT *
FROM application
WHERE UPPER(values :: TEXT) LIKE '%some text%'
现在我只需要搜索值。 SQL 查询此目的:
SELECT *
FROM application, LATERAL json_each_text(application.values :: JSON)
WHERE value :: TEXT LIKE '%some text%';
如何将其添加到限制中?也许还有其他用于搜索值的变体?
休眠 5.0.12
Restrictions.sqlRestriction 将插入到生成的 sql 中,在带有 AND 的 WHERE 子句之后,因此您需要添加类似这样的内容
criteria.add(Restrictions.sqlRestriction("this_.id IN (SELECT application.id FROM application , LATERAL json_each_text(values :: JSON) WHERE UPPER(value :: TEXT) LIKE '%" + appFilter.getSearchValue().toUpperCase() +"%')"));
在客户端,我们有用于使用过滤器进行搜索的端点。
在后端,我有在 Postgresql 数据库中搜索的方法。选项之一 - 搜索 jsonb 字段。
在这一天之前,我搜索了 values 和 keys。我的代码是:
if (appFilter.getSearchValue() != null) {
criteria.add(Restrictions.sqlRestriction("UPPER(values::text) LIKE '%" + appFilter.getSearchValue().toUpperCase() + "%'"));
}
SQL 模拟(UPPER
- 不是强制性的):
SELECT *
FROM application
WHERE UPPER(values :: TEXT) LIKE '%some text%'
现在我只需要搜索值。 SQL 查询此目的:
SELECT *
FROM application, LATERAL json_each_text(application.values :: JSON)
WHERE value :: TEXT LIKE '%some text%';
如何将其添加到限制中?也许还有其他用于搜索值的变体? 休眠 5.0.12
Restrictions.sqlRestriction 将插入到生成的 sql 中,在带有 AND 的 WHERE 子句之后,因此您需要添加类似这样的内容
criteria.add(Restrictions.sqlRestriction("this_.id IN (SELECT application.id FROM application , LATERAL json_each_text(values :: JSON) WHERE UPPER(value :: TEXT) LIKE '%" + appFilter.getSearchValue().toUpperCase() +"%')"));