【问题标题】:Merge multiple Spring JPA Page objects results合并多个 Spring JPA Page 对象结果
【发布时间】:2020-01-08 23:19:55
【问题描述】:

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

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 和相应的汽车模型,然后我将它们传递给查询以获取作为页面对象的 carDetails。因此,不同的 carMake 会多次调用相同的查询。 问题是我如何在这里管理 Page 对象。在上述场景中,Page 对象将仅包含 carModelList 中最后一辆车的详细信息,其余部分将被覆盖,因为我没有 与 List 一样,可以选择 carDetails.addAll()。

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

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());

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

【问题讨论】:

  • 问题不清楚。你能更好地解释一下你的需求吗?我理解你的代码,但我不明白你的要求。

标签: java spring-data-jpa jpa-2.0


【解决方案1】:

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

大致思路是这样的:

假设您的域中有两个类:

@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;
  }
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 2017-04-14
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多