如何为 Page<> 接口创建 DTO?
Posted
技术标签:
【中文标题】如何为 Page<> 接口创建 DTO?【英文标题】:How do I make a DTO for the Page<> interface? 【发布时间】: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 - 支持不要说谢谢你是最棒的,伙计!)
【参考方案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查看
【讨论】:
以上是关于如何为 Page<> 接口创建 DTO?的主要内容,如果未能解决你的问题,请参考以下文章