spring - 在 Spring 存储库中使用 Querydsl 和 JPAQuery 进行大型或复杂查询?
问题描述
在 Spring Boot 应用程序中使用@Repository
派生查询有点容易。
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByEmail(String email);
}
但是,如果查询变得更加复杂(连接、子查询等),那么我们将使用 Querydsl,如下面的伪代码示例所示。
JPAQuery<User> query = new JPAQuery<>(entityManager);
List<User> deletableUsers = query
.select(user)
.from(user)
.join(someTable)
.on(user.id.eq(someTable.user.id))
.where(user.notIn(createSubquery(compareDate))
.and(condition1)
.and(condition2)
.and(condition3)
.distinct()
.fetch();
private JPQLQuery<User> createSubquery(Date compareDate) {
return JPAExpressions
.select(user)
.from(user)
.join(someOtherTable)
.on(user.id.eq(someOtherTable.user.id))
.where((condition4
.and(condition5)
.and(condition6)))
.distinct();
}
目前,我们在一个@Service
类中使用这个查询,但我想知道将它移动到 Spring 存储库是否有意义,以便所有“查询相关”方法都位于存储库中。
- 这种方法是否可行,即您是否看到任何障碍,例如将其
EntityManager
注入存储库? @Query
尽管查询字符串变得又长又复杂,您是否更愿意推荐使用注释?
解决方案
推荐阅读
- java - 为什么添加 Firebase 插件后出现奇怪的 Gradle 错误?
- android - 支持的最低 Gradle 版本为 6.5。当前版本是 6.1.1。请修复项目的 Gradle 设置
- curl - DNS 重定向到 AWS S3 静态网站适用于 curl,但浏览器失败
- sql - 如何根据唯一列和单独列中的最高量过滤结果集?
- .net-core - 发布时将配置设置为“发布”
- google-sheets - 在特定列上将 2 个工作表连接在一起
- class - 按钮更改另一个类中的变量
- swift - 是否可以在新的 init 中实现对 Swift (SwiftUI) 类的通用约束?
- python - 使用 Pytest 测试正确的异常
- c - OpenGL 纹理位图偏移问题