Spring JPA 存储库方法获取排序的非空值

Spring JPA repository method to get sorted distinct and non-null values

根据多列获取不同的数据,排除列上的 NULL 值并对结果排序 在 SQL 中,我会这样写查询:

SELECT DISTINCT CAR_NUMBER, CAR_NAME
FROM CAR
WHERE CAR_NUMBER IS NOT NULL
ORDER BY CAR_NUMBER

这会 return 我的 CAR_NUMBER 和 CAR_NAME 具有不同值的行,它会排除任何 CAR_NUMBER = NULL 的行,最后,它会对CAR_NUMBER.

结果

但是,在 Spring JPA 中,我了解到您可以使用根据您的实体字段命名的方法或使用 @Query 注释。

我正在尝试这样做:

List<Car> findDistinctByCarNumberAndCarNameAndCarNumberIsNotNull(Sort sort);

,并像这样调用此方法:

myRepo.findDistinctByCarNumberAndCarNameAndCarNumberIsNotNull(Sort.by("carNumber"));

但这在 Maven 上失败 > 安装时出现错误,如“findDistinctByCarNumberAndCarNameAndCarNumberIsNotNull(Sort sort) 需要至少 1 个参数,但只找到 0”。

同样,我尝试使用 @Query 如下,但效果相同:

@Query(SELECT DISTINCT c.carNumber, c.carName FROM carEntity c WHERE c.carNumber IS NOT NULL ORDER BY c.carNumber)
List<Car> findAllCars();

我找到问题了。以下是我的解决方法:

在我的存储库中:

@Query("select distinct c.carNumber, c.carName from CarEntity c where c.carNumber is not null")
List<Object> findAllDistinctRegions(Sort sort);

这里需要注意的是 @Query returns List<Object>,而不是 List<Car>.

接下来,在我的服务中,调用这个方法:

    List<Object> carData = carRepository.findAllDistinctCars(Sort.by("carNumber"));
    

终于成功了;但是,我 运行 遇到了另一个问题,我不得不从列表到列表进行必要的转换。

    // This is bit tricky as the returned List<Object> is actually
    // List<Object[]>.  Basically, each field returned by the @Query 
    // is placed into an array element.  
    //To solve it, I had to do following:
    List<Car> cars = new ArrayList<Car>();
    for(Object data: carsData) {
        Object[] obj = (Object[]) data;
        cars.add(new CarDto((Short) obj[0], ((String) obj[1]));
    }

我只记得有比您在回答中描述的辅助函数更好的方法来解决这个问题,我想我会分享它。

JPQL 中的投影是创建 DTO 的更简洁的方法:

@Query("SELECT DISTINCT new com.yourdomain.example.models.MyDto(c.carNumber, c.carName)
FROM CarEntity c WHERE c.carNumber is not null")
List<CarDto> findAllDistinctRegions(Sort sort);