Using Querydsl and JPAQuery within a Spring repository for large or complex queries?

Viewed 100

In a Spring Boot application using a @Repository with derived queries is somewhat easy.

@Repository
public interface UserRepository extends JpaRepository<User, Long> {

    Optional<User> findByEmail(String email);
}

If, however, the queries are getting more complex (joins, subqueries, etc.) then we're using Querydsl like in the following pseudo-code example.

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();
}

Currently, we're using this query from within a @Service class but I wonder if it might make sense to move that to the Spring repository, so that all "query related" methods are located in the repository.

  • Is such an approach feasible, i.e. do you see any impediments like injecting the EntityManager into the repository?
  • Would you rather recommend to use the @Query annotation despite the query string getting long and complex?
0 Answers
Related