QuerydslJpaPredicateExecutor 按子类中的字段排序

QuerydslJpaPredicateExecutor sort by field in subclass

1) 示例中使用的模型

@Getter
@Setter
@Entity
@Table(name = "car")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Car {
    
    private String color;
}


@Entity
@Getter
@Setter
public class Truck extends Car { 
    
    private Clutch clutch;
}

@Entity
@Getter
@Setter
public class Clutch { 

    private String manufacturerCode;
}

和存储库 类:

public interface CarRepository extends JpaRepository<Car, Integer>,
        QuerydslPredicateExecutor<Car> {}
        
public interface TruckRepository extends JpaRepository<Truck, Integer>,
        QuerydslPredicateExecutor<Truck> {}
        
public interface PassengerCarRepository extends JpaRepository<PassengerCar, Integer>,
        QuerydslPredicateExecutor<PassengerCar> {}
    

2。问题

在 GUI 中调用了所有“汽车”,因此调用来自“CarRepository”:

carRepository.findAll(predicate, pageable)

我可以创建自己的“可分页”实现,并像这样在其中放置“排序”:

@Getter
public class OwnPageable extends AbstractPageRequest {
    private final Sort sort;

    public CustomPageRequest(final int page, final Sort sort) {
        super(page, size);
        this.sort = sort;
    }

因此在这个调用中:carRepository.findAll(predicate, pageable) 我将“OwnPageable”与“排序”字段放在一起。它工作得很好。但只有当我从 Car 中指定字段时,而不是从任何具体实现中指定字段时。如果我将: org.springframework.data.domain.Sort 和 属性 clutch.manufacturerCode 放入 ownPageable 它将不起作用,因为 clutch 不是 car 实体的一部分。很清楚了。

3。问题

如何在我的示例中按 clutch.manufacturerCode 排序?

你正在尝试的是不可能的。您想要对所有 Car 进行排序,这些 Car 可以是任意数量的子类型,例如 SuvSport 等,这些子类型可能有也可能没有嵌套的 属性 clutch.manufacturerCode.

由于您将子类型的 属性 指定为排序顺序,因此它不会出现在所有汽车中,在您的情况下,它只能对 Car 进行排序,即 trucks 与 clutch。如果允许,休眠在检索其他类型的 Car 时会遇到麻烦,而这些 Car 没有此 属性.