jpa - Spring Data JPA:使用 Pageable 但使用实体的一组特定字段
问题描述
我正在使用Spring Data
2.0.6.RELEASE。
我正在为性能和演示目的进行分页。关于性能,我说的是如果我们有很多记录,最好通过页面显示它们
我有以下内容并且工作正常:
interface PersonaDataJpaCrudRepository extends PagingAndSortingRepository<Persona, String> {
}
@Controller
工作正常:
@GetMapping(produces=MediaType.TEXT_HTML_VALUE)
public String findAll(Pageable pageable, Model model){
通过Thymeleaf
我能够应用分页。因此,到这里为止,目标已经完成。
注意:该类Persona
用JPA
( @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[]
返回类型,因为我正在使用特定的字段集。
- 是否强制使用每个实体的完整字段集?在这种情况下,我是否应该简单地接受关于 16 个从未使用过的字段的内存成本?它为每条检索到的记录?
- 是否有解决方案可以使用特定的字段集或
Object[]
当前的 APISpring Data
?
解决方案
看看 Spring data Projections。例如,基于接口的投影可用于通过特定的 getter 方法公开某些属性。
界面:
interface PersonaSubset {
long getId();
String getNombre();
String getApellido();
String getFecha();
}
存储方法:
Page<PersonaSubset> findAll(Pageable pageable);
推荐阅读
- javascript - clearTimeout 不适用于 React Native
- python - 将词向量从 Gensim 加载到 SpaCy Vectors 类
- swift - 在 SCNKit 场景中更改模糊距离
- python - LOSS 在非常简单的 KERAS 二元分类器中没有改变
- javascript - 是否可以使用打字稿映射类型来制作接口的一种非功能属性?
- python - 在尝试操作/过滤由 groupby 操作创建的数据框时使用 (>= & <=) 出现问题
- shell - 如何将文件从远程服务器的docker容器复制到本地机器
- python - 如何避免 PyTorch 中的“CUDA 内存不足”
- javascript - 如何从输入中只获取数字
- alpacajs - TypeError: $(...).getValue 不是函数