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”和“sort”字段放在一起。它工作得很好。但只有当我从 Car
中指定字段时,而不是从任何具体实现中指定字段时。如果我将: org.springframework.data.domain.Sort
和属性 clutch.manufacturerCode
放入 ownPageable
它将不起作用,因为 clutch
不是 car
实体的一部分。这很清楚。
3。问题
在我的示例中如何按 clutch.manufacturerCode
排序?
最佳答案
你正在尝试的是不可能的。您想要对所有 Car
进行排序,它们可以是任意数量的子类型,例如 Suv
、Sport
等,这些子类型可能有也可能没有嵌套属性 clutch.manufacturerCode
。
由于您将子类型的属性指定为排序顺序,它不会出现在所有汽车中,在您的情况下,它只能对 Car
进行排序,它们是 truck
带有 clutch
的。如果允许,休眠在检索其他类型的 Car
时会遇到麻烦,但没有此属性。
关于spring-data - QuerydslJpaPredicateExecutor 按子类中的字段排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62719731/