【发布时间】:2020-06-10 10:36:18
【问题描述】:
我有一个用 Spring Boot 版本 1.5.x 编写的项目,它连接到 MariaDB 数据库和几个表,它们之间存在大量关系。为了查询数据库,我使用了 org.springframework.data.jpa.repository 中提供的 JpaSpecificationExecutor 接口。我们使用规范的原因是构建动态查询,而不必为存储库本身中的每个过滤器可能性编写新查询。在实体本身中,每个关系都有 Lazy fetchtype。此外,关系的获取是动态的,并且每次都不相同,我还在规范中定义了必须获取的内容。
因为我们有一个大数据集,所以我们实现了分页,同样使用了 JpaSpecificationExecutor 接口提供的方法。现在我注意到,每次我要求获取要获取的 OneToMany 关系时,分页在内存中而不是在数据库中执行,限制从查询中删除。这种行为是可以预料的,但现在我正在寻找一种解决方法。请考虑以下示例:
例如,我们有 3 个表:Person、Role 和 Title。每个人都可以有多个角色和多个头衔。我们考虑解决问题的一种方法是使用以下查询:
SELECT
*
FROM
Person p
JOIN
Role r on r.f_person = p.id
JOIN
Title t on t.f_person = p.id
JOIN
(SELECT
p2.id
FROM
Person p2
WHERE
p2.name LIKE '%John%'
ORDER BY p2.name DESC
LIMIT 100 OFFSET 100) AS p2 ON p2.id = p.id
有没有办法在规范中或使用实体管理器来构建此查询,以便我们可以保持查询的动态特性。
【问题讨论】:
标签: hibernate jpa spring-data-jpa spring-data criteria-api