首页 > 解决方案 > 在 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 存储库是否有意义,以便所有“查询相关”方法都位于存储库中。

标签: springspring-bootspring-dataquerydsl

解决方案


推荐阅读