【问题标题】:How do I make a DTO for the Page<> interface?如何为 Page<> 接口创建 DTO?
【发布时间】:2020-07-30 15:18:52
【问题描述】:

我正在使用Spring Boot (MVC) 和Hiberbate 编写一个在线商店。问题是当我得到一份饮料清单时,JSON 会从Page 接口给我提供不必要的信息。我不知道如何为interfaces 创建一个DTO 以摆脱这些字段。在这种情况下我该怎么办。有人可以提供现成的解决方案吗?

    public Page<DrinkDTO> getAllDrinks(int page, int pageSize) {

        PageRequest pageRequest = PageRequest.of(page, pageSize, Sort.by("id"));

        final Page<Drink> drinks = drinkRepository.findAll(pageRequest);

        return drinkMapper.drinksToDrinksDTO(drinks);
    }

【问题讨论】:

  • 一种方法是为此编写自定义Page,您可以在其中删除它们example
  • 如果您不想要页面信息,请不要返回页面。获取页面信息:drinks.getContent()。然后你可以在包装类中添加你想要的任何信息。
  • @User - 支持不要说谢谢你是最棒的,伙计!)

标签: java spring jpa dto pageable


【解决方案1】:
@Data
@AllArgsConstructor
public class CustomPage {

    Long totalElements;

    int totalPages;

    int number;

    int size;
}
@Data
public class PageDTO<T> {

    List<T> content;

    CustomPage customPage;

    public PageDTO(Page<T> page) {
        this.content = page.getContent();
        this.customPage = new CustomPage(page.getTotalElements(),
                page.getTotalPages(), page.getNumber(), page.getSize());
    }

服务举例:

public PageDTO<DrinkDTO> getAllDrinks(int page, int pageSize) {

        PageRequest pageRequest = PageRequest.of(page, pageSize, Sort.by("id"));

        final Page<Drink> drinks = drinkRepository.findAll(pageRequest);

        return new PageDTO<DrinkDTO>(drinkMapper.drinksToDrinksDTO(drinks));
    }

【讨论】:

    【解决方案2】:

    我使用原生查询,然后我大部分时间都做 dto 预测。

    这里是一个DTO投影的例子

    public interface OvertimeRequestView {
    public Long getId();
    
    public String getEmployeeFirstName();
    
    public String getEmployeeLastName();
    
    public Long getOvertimeHours();
    
    public Date getOvertimeDate();
    
    public String getDescription();
    
    public String getStatus();
    
    public String getApproverName();
    
    public default String getEmployeeFullName() {
        String lastName = this.getEmployeeLastName();
        String firstName = this.getEmployeeFirstName();
        if (null != firstName) {
            return firstName.concat(" ").concat(lastName);
        }
        return lastName;
    }
    
    }
    

    这里是带有本机查询的存储库。请注意,由于查询返回“id”列,我在上面的 dto 中有一个 getId() 方法,并且因为它有 employeeFirstName,所以我在 dto 中有 getEmployeeFirstName() 等等。另请注意,我包含了一个计数查询,但没有计数查询,查询有时会失败,尤其是在查询很复杂且包含连接时

    @Query(value = "select ovr.id,\n" +
            "       u.first_name       as employeeFirstName,\n" +
            "       u.last_name        as employeeLastName,\n" +
            "       ovr.overtime_date  as overtimeDate,\n" +
            "       ovr.description  as description,\n" +
            "       ovr.overtime_hours as overtimeHours\n" +
            "from overtime_requests  ovr\n" +
            "         left join employees e on ovr.employee_id = e.id\n" +
            "         left join users u on e.user_id = u.id",
            nativeQuery = true,
            countQuery = "select count(ovr.id)\n" +
                    "from overtime_requests  ovr\n" +
                    "         left join employees e on ovr.employee_id = e.id\n" +
                    "         left join users u on e.user_id = u.id")
    public Page<OvertimeRequestView> getAllActive(Pageable pageable);
    

    更多信息您可以通过spring data documentation查看

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多