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
可以是任意数量的子类型,例如 Suv
、Sport
等,这些子类型可能有也可能没有嵌套的 属性 clutch.manufacturerCode
.
由于您将子类型的 属性 指定为排序顺序,因此它不会出现在所有汽车中,在您的情况下,它只能对 Car
进行排序,即 truck
s 与 clutch
。如果允许,休眠在检索其他类型的 Car
时会遇到麻烦,而这些 Car
没有此 属性.
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
可以是任意数量的子类型,例如 Suv
、Sport
等,这些子类型可能有也可能没有嵌套的 属性 clutch.manufacturerCode
.
由于您将子类型的 属性 指定为排序顺序,因此它不会出现在所有汽车中,在您的情况下,它只能对 Car
进行排序,即 truck
s 与 clutch
。如果允许,休眠在检索其他类型的 Car
时会遇到麻烦,而这些 Car
没有此 属性.