spring jpa之实体属性类型转换器AttributeConverter,自定义Converter,通用Converter
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring jpa之实体属性类型转换器AttributeConverter,自定义Converter,通用Converter相关的知识,希望对你有一定的参考价值。
参考技术A 在JPA注解中,有个@Convert注解,其中需要传入一个Class作为convert参数,该class需要实现AttributeConverter<X,Y>接口。下面来看看AttributeConverter接口的作用。实体属性类型转换器。主要使用场景:
简单化操作,用持久化enum枚举来进行一个操作。 AttributeConverter<X,Y> 该接口中需要实现两个方法:
场景:用户登录时,记录用户的动作:登录,登出,注册,重置密码。
数据的加密和日期的转换也就类似的操作了。
但是这样的每个枚举可能都要去写这样的转换类,可能会存在重复的操作。可以尝试写个通用的枚举转换类。
如何在 Spring MVC (JPA) 中将实体对象列表转换为页面对象?
【中文标题】如何在 Spring MVC (JPA) 中将实体对象列表转换为页面对象?【英文标题】:How to convert a list of enity object to page object in Spring MVC (JPA)? 【发布时间】:2016-09-05 07:44:31 【问题描述】:我有一个List
的实体。
如何使用 Spring MVC 4 和 Spring Data JPA 将其转换为 Page
对象?
【问题讨论】:
【参考方案1】:为此有一个Page
implementation:
final Page<Something> page = new PageImpl<>(theListOfSomething);
【讨论】:
它不分页,而是在一页中返回所有项目 会有错误【参考方案2】:还有一个Constructor:
Page<Something> page = new PageImpl<>(listOfsomething, pageable, listOfsomething.size());
【讨论】:
这里是创建pageable
对象的方法:Pageable pageable = PageRequest.of(pageNumber, size);
注意pageNumber
是从零开始的并且Pageable
和PageRequest
是从org.springframework.data.domain
。有关详细信息,请参阅Pageable documentation
@Mehraj Malik 我的不适用于此...***.com/questions/62485592/…【参考方案3】:
我认为您还需要获取正确的页面内容。
PageRequest pageRequest = PageRequest.of(offset, limit);
List<Product> products = getProducts();
int total = products.size();
int start = toIntExact(pageRequest.getOffset());
int end = Math.min((start + pageRequest.getPageSize()), total);
List<Product> output = new ArrayList<>();
if (start <= end)
output = products.subList(start, end);
return new PageImpl<>(
output,
pageRequest,
total
);
【讨论】:
【参考方案4】:您可以将列表传递给函数以使其成为可分页对象。如果子列表的起始值小于列表大小,则返回空内容。
public Page<?> toPage(List<?> list, Pageable pageable)
int start = (int) pageable.getOffset();
int end = Math.min((start + pageable.getPageSize()), list.size());
if(start > list.size())
return new PageImpl<>(new ArrayList<>(), pageable, list.size());
return new PageImpl<>(list.subList(start, end), pageable, list.size());
【讨论】:
【参考方案5】:以上答案都假设列表是您希望返回的。以下是对包含 total 条记录的列表执行分页的方法。
//pageNum starts with 1
//size: page size
//totalRecords, total records
Page<Record> myMethod(int pageNum, int size, List<MyRecord> totalRecords)
if(pageNum<1)
pageNum = 1;
if(size < 1)
size = 10;
//spring page starts with 0
Pageable pageable = new PageRequest(pageNum-1, size);
//when pageNum * size is too big(bigger than list.size()), totalRecords.subList() will throw a exception, we need to fix this
if(pageable.getOffset() > list.size())
pageable = new PageRequest(0, size);
List<MyRecord> pageRecords = totalRecords.subList(pageable.getOffset(), Math.min(pageable.getOffset() + pageable.getPageSize(), totalRecords.size()));
Page springPage = new PageImpl<>(pageRecords, pageable, totalRecords.size());
return springPage;
【讨论】:
【参考方案6】:通常,控制器应接收Pageable
对象作为参数。 Pageable
对象包含页码、页面大小和排序信息。
然后就可以通过排序查询JpaRepository
中的所有实体,生成Page
对象:
List<Entity> allList = jpaRepository.findAll(pageable.getSort());
List<Entity> pageList = allList.stream()
.skip(pageable.getPageSize() * pageable.getPageNumber())
.limit(pageable.getPageSize())
.collect(Collectors.toList());
return new PageImpl<>(pageList, pageable, allList.size());
【讨论】:
以上是关于spring jpa之实体属性类型转换器AttributeConverter,自定义Converter,通用Converter的主要内容,如果未能解决你的问题,请参考以下文章
Spring:JPA 将原生 SQL 转换为非实体 pojo
如何在 Spring MVC (JPA) 中将实体对象列表转换为页面对象?
Spring/JPA/persistence 实体属性字段不能是最终的?