首页 > 解决方案 > Spring Data JPA:使用 Pageable 但使用实体的一组特定字段

问题描述

我正在使用Spring Data2.0.6.RELEASE。

我正在为性能和演示目的进行分页。关于性能,我说的是如果我们有很多记录,最好通过页面显示它们

我有以下内容并且工作正常:

interface PersonaDataJpaCrudRepository extends PagingAndSortingRepository<Persona, String> {
}

@Controller工作正常:

@GetMapping(produces=MediaType.TEXT_HTML_VALUE)
public String findAll(Pageable pageable, Model model){

通过Thymeleaf我能够应用分页。因此,到这里为止,目标已经完成。

注意:该类PersonaJPA( @Entity, Id, 等)注释

现在我关心的是:即使分页在Spring Data记录的数量上起作用,每条记录的内容又如何呢?

我的意思是:假设Persona该类包含 20 个字段(考虑您的应用程序所需的任何实体),因此对于基于html报告使用 4 个字段(id、名字、姓氏、日期)的视图,因此我们有 16 个不必要的字段对于内存中的每个实体

我尝试了以下方法:

interface PersonaDataJpaCrudRepository extends PagingAndSortingRepository<Persona, String> {

    @Query("SELECT p.id, id.nombre, id.apellido, id.fecha FROM Persona p")
    @Override
    Page<Persona> findAll(Pageable pageable);

}

如果我在其中进行简单的打印,@Controller则会失败以下内容:

java.lang.ClassCastException: 
[Ljava.lang.Object; cannot be cast to com.manuel.jordan.domain.Persona

如果我避免视图失败:

Caused by: 
org.springframework.expression.spel.SpelEvaluationException: 
EL1008E: 
Property or field 'id' cannot be found on object of type 
'java.lang.Object[]' - maybe not public or not valid?

我在 SO 中阅读了许多帖子,例如:

我理解答案并且我同意Object[]返回类型,因为我正在使用特定的字段集。

  1. 是否强制使用每个实体的完整字段集?在这种情况下,我是否应该简单地接受关于 16 个从未使用过的字段的内存成本?它为每条检索到的记录?
  2. 是否有解决方案可以使用特定的字段集或Object[]当前的 API Spring Data

标签: jpaspring-dataspring-data-jpa

解决方案


看看 Spring data Projections。例如,基于接口的投影可用于通过特定的 getter 方法公开某些属性。

界面:

interface PersonaSubset {
    long getId();
    String getNombre();
    String getApellido();
    String getFecha();
}

存储方法:

Page<PersonaSubset> findAll(Pageable pageable);

推荐阅读