使用方法名称的 JPA 自动查询生成未按预期工作

问题描述 投票:0回答:1

在下面,

findAll
findByUserNameAndPlantId
正在工作,而
findAllByPlantId
findAllByAccessPlantsSet_AccessPlantKey_Plant_PlantIdIn
则不起作用。两者都会生成错误的查询(与 Spring Boot 1.5.3-release 相比)并抛出相同的异常。

它在 Spring Boot 1.5.3 版本中工作,但在 2.7.16 中不起作用。代码有问题吗?

public interface UserPagingAndSortingRepository extends PagingAndSortingRepository<User, Long> {

    @Override
    Page<User> findAll(Pageable page);

    @Query("SELECT  DISTINCT  u FROM User u LEFT OUTER JOIN  u.accessPlantsSet a where (UPPER(u.userName) = UPPER(?1)) and a.accessPlantKey.plant.plantId in (?2)")
    Page<User> findByUserNameAndPlantId(String userName, List<Long> plantIds, Pageable page);

    @Query("SELECT  u FROM User u LEFT OUTER JOIN  u.accessPlantsSet ap where ap.accessPlantKey.plant.plantId in (?1)")
    Page<User> findAllByPlantId(List<Long> plantIds, Pageable pageParam);

    Page<User> findAllByAccessPlantsSet_AccessPlantKey_Plant_PlantIdIn(List<Long> plantIds, Pageable pageParam);
}

更多详细信息请参见此处https://github.com/spring-projects/spring-data-jpa/issues/3226

例外的是

Unable to find com.gtl.industryapp.auth.middleware.domain.Plant with id 12; nested exception is javax.persistence.EntityNotFoundException: Unable to find com.gtl.industryapp.auth.middleware.domain.Plant with id 12

相同的代码在 Spring Boot 1.5.3-RELEASE 中运行正常,没有出现此异常

我对查询和方法名称进行了更改,如下

@Query("SELECT u FROM User u LEFT OUTER JOIN  u.accessPlantsSet a WHERE u.userName like :name and a.accessPlantKey.plant.plantId in (:plantIds)")
Page<User> findAllByNameAndPlantId(@Param("name") String name, @Param("plantIds") List<Long>  plantIds,Pageable page); 

我在另一个类中调用上述方法,如下所示

 Page<user> pagedUsers = userPagingAndSortingRepository.findAllByNameAndPlantId("[email protected]",plantIds, pageParam);

我正在得到这个结果。 但是当我使用以下参数调用时,它会抛出相同的异常。有多个用户的用户名具有 test.lt。但它失败了。我认为如果结果中有多个用户,这会失败吗?是这样吗

 Page<user> pagedUsers = userPagingAndSortingRepository.findAllByNameAndPlantId("%test.lt%",plantIds, pageParam);
spring-boot hibernate spring-data-jpa spring-data
1个回答
0
投票

在检查了所有生成的查询和相应的表后,我发现问题是由于数据造成的。 在与 userId 19 相对应的 RM_AccessPlants 表中,有一个 plantId 12,并且该 plantid 12 不存在于 Mstr_Plant 中

© www.soinside.com 2019 - 2024. All rights reserved.