【问题标题】:QuerydslJpaPredicateExecutor sort by field in subclassQuerydslJpaPredicateExecutor 按子类中的字段排序
【发布时间】:2020-07-03 16:56:00
【问题描述】:

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)

我可以创建自己的“pageable”实现并将“sort”放入其中,如下所示:

@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 排序?

【问题讨论】:

    标签: spring-data querydsl


    【解决方案1】:

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

    由于您将子类型的属性指定为排序顺序,它不会出现在所有汽车中,在您的情况下,它只能对 trucks 和 clutch 进行排序。如果允许,hibernate 在检索其他类型的不具有此属性的Cars 时会遇到麻烦。

    【讨论】:

    • 1) 谢谢你的解释 2) 你能告诉我我能做些什么来做这个排序吗?
    • 我认为首先是了解需求。假设您有 1000 辆汽车,其中 970 辆是 Suv 或任何其他类型,其余 30 辆是 Trucks。您只能对 30 辆汽车进行分类。那么,您是否希望首先按排序顺序检索 30 辆卡车,然后再按任意顺序检索 970 辆,因为它们不是卡车?甚至用原生sql查询来实现,这个也需要先搞清楚
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多