合并多个 Spring JPA Page 对象结果

Ami*_*mit 10 java jpa-2.0 spring-data-jpa

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

List<String> carMake = getUserCarMake();
Page<Car> carDetails = carRepository.findAllCarsInfo(carMake, pageRequest);
Run Code Online (Sandbox Code Playgroud)

CarRepository.java

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

现在我的要求已更改为获取每个汽车制造商的基于汽车模型的汽车详细信息。所以我改变了代码,如图所示


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)
        }

    }
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

因此,对于每辆车,我都有一个汽车制造商和该制造商的相应汽车模型,然后我将其传递给查询以获取汽车详细信息,这是一个页面对象。因此,对于不同的汽车制造商多次调用相同的查询。问题是我如何在这里管理 Page 对象。在上面的场景中,Page 对象将只包含来自 carModelList 的最后一辆车的详细信息,其余部分将被覆盖,因为我没有像 List 那样的 carDetails.addAll() 选项。

注意:我不能使用下面的查询,因为模型可以在不同品牌之间重叠。

SELECT A FROM Cars A WHERE A.model IN ?1 AND A.make IN ?2
Run Code Online (Sandbox Code Playgroud)

另外我的 pageRequest 的大小为 (0, 20 )

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

Page<Car> carDetails = new PageImpl <>(carDetailsList, pageRequest, carDetailsList.size());
Run Code Online (Sandbox Code Playgroud)

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

dea*_*mon 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;
}
Run Code Online (Sandbox Code Playgroud)

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

@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;
  }
}
Run Code Online (Sandbox Code Playgroud)

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