Spring数据jpa离开了join fetch和where子句

时间:2016-09-10 17:08:09

标签: java spring jpa spring-data-jpa

我的存储库中有以下查询:

SELECT p FROM Project p JOIN p.users u WHERE u.login =:login

用户和项目之间存在多对多的关系。 一切正常,它返回用户的项目,但我希望每个项目都能返回相应的用户集。

更新:尝试以下mateuszlo建议:

SELECT p FROM Project p JOIN FECTH p.users JOIN p.users u WHERE u.login =:login

但现在我得到以下例外:

nested exception is java.lang.IllegalArgumentException: Count query validation failed for method public abstract org.springframework.data.domain.Page com.example.app.repository.ProjectRepository.findAllByUserLo‌​gin(java.lang.String‌​,org.springframework‌​.data.domain.Pageabl‌​e)! org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list

2 个答案:

答案 0 :(得分:3)

无法为FETCH JOIN查询创建命名别名,以便在WHERE语句中使用它。 JPA不会故意这样做,因为它很容易导致不必要的情况。

考虑Project X,其中有3 Users:John,Tom和Mike。使用FETCH JOIN查询项目,用户John将返回Project X只有一个User - John。这将产生一个不完整的Project实体,这与当前的数据库状态不一致。

所以你要做的就是加入两次。第一次使用正常JOIN,以识别正确的Projet记录,然后第二次使用FETCH JOIN来获取对应Users

SELECT p FROM Project p 
JOIN FETCH p.users
JOIN p.users u WHERE u.login =:login

答案 1 :(得分:0)

首先,我假设您正在使用分页?那是您的JPA查询方法上有一个Pagable参数吗?如果是这样,有两种解决方法。

计数查询

@Query(value = "SELECT p FROM Project p " +
       "LEFT JOIN FETCH p.users u WHERE u.login :=login",
countQuery = "SELECT COUNT(u) FROM User u WHERE u.login :=login")
Page<Project> fetchProjectsByUserLogin(String login, Pageable pageable);

实体图

@Query(value = "SELECT p FROM Project p " +
       "LEFT JOIN p.users u WHERE u.login :=login")
@EntityGraph(attributePaths = {"users"}, type = EntityGraph.EntityGraphType.FETCH)
Page<Project> fetchProjectsByUserLogin(String login, Pageable pageable);