合并多个 Spring JPA Page 对象结果

问题描述 投票:0回答:2

我最初的要求是获取汽车详细信息:

List<String> carMake = getUserCarMake();
Page<Car> carDetails = carRepository.findAllCarsInfo(carMake, pageRequest);

CarRepository.java

@Query(value="SELECT A FROM Cars A WHERE A.model = ?1 
 public Page<Cars> findAllCarsInfo(List<String> carMake, Pageable pageRequest);

现在我的要求已更改为根据每个汽车品牌的汽车型号获取汽车详细信息。所以我改变了代码,如图所示


for (Cars car : userCars) {
    String carMake = car.getCarMake();
       List<String> carModelForMake = new ArrayList<>();
       List <CarModels> carModelList  = car.getCarModels();
        for (CarModels carModel : carModelList) {
            carModelForMake.add(carModel.getModelName());

    Page<Car> carDetails = carRepository.findAllCarsInfo(carModelForMake, carMake, pageRequest)
        }

    }

CarRepository.java

@Query(value="SELECT A FROM Cars A WHERE A.model IN ?1 AND A.make = ?2” 

public Page<Car> findAllCarsInfo(List<String> carModel, String carMake,Pageable pageRequest);

因此,对于每辆车,我都有一个 carMake 和相应的 carModels,然后我将其传递给查询以获取 carDetails(这是一个页面对象)。因此,不同的 carMake 会多次调用同一查询。 问题是我如何管理这里的 Page 对象。在上面的场景中,Page 对象将仅包含 carModelList 中最后一辆车的详细信息,其余部分将被覆盖,因为我不这样做 可以选择 carDetails.addAll() ,就像 List 一样。

注意: 我无法使用以下查询,因为模型可以跨不同品牌重叠。

SELECT A FROM Cars A WHERE A.model IN ?1 AND A.make IN ?2

我的 pageRequest 的大小也为 (0, 20 )

我尝试修改查询以删除 pageRequest 并使用 findAll 获取 List 中的结果,然后将它们转换为 PageObject,但这会破坏分页,因为 page.getContent() 具有整个结果集而不仅仅是 20 条记录。

Page<Car> carDetails = new PageImpl <>(carDetailsList, pageRequest, carDetailsList.size());

如何有效地获取 Page 对象或合并不同的页面对象,以便我的分页像我之前的要求一样工作。

java spring-data-jpa jpa-2.0
2个回答
0
投票

有时,创建一个特殊的“查询实体”类是一个好主意,其中包含响应某种客户端请求所需的所有内容。

总体思路是这样的:

假设您的域中有两个类:

@Entity
@Table(name = "table_a")
public class A {

  @Id int id;
  String propertyA;
  int bId;
}

@Entity
public class B {
  @Id int id;
  String propertyB;
}

然后将这两个提到的“查询实体”(域外)组合起来。

@Entity
@Table(name = "table_a")
public class QueryEntity {
  private @Id private int aId;
  private String propertyA;
  private B b;

  public String propertyA() {
    return propertyA;
  }

  public String propertyB() {
    return b.propertyB;
  }
}

我不太确定这种方法是否适用于您的情况,但希望它能让这个想法变得清晰。


0
投票

没有100%理解需求。 但一般来说,在回答您的问题时,请坚持使用一种方法,即查询语言或 ORM。当你尝试同时使用两者时,事情会很困难。

由于您的需求有点复杂,需要更精细的控制,所以最好使用查询语言。不要使用页面模型,在查询中使用限制和偏移量,并使用 do while 循环在代码中处理分页,这是处理分页的经典方法。

© www.soinside.com 2019 - 2024. All rights reserved.