java如何编辑Spring可分页对象?
我需要能够编辑一个可分页的对象,更具体地说是其中的一种
我有一些DTO Member
,它有一个属性emailAddress
。客户不知道,这是通过查询从两个不同实体收集的信息,要么Account
要么Invite
。一个Member
总是有其中一个。
这已经足够好了,我在回购协议中执行标准的JPA查询,并在将其转换为DTO之前收集所需的信息
现在我们要根据这个引用的属性进行排序。没关系。我可以创建一个包含ORDER BY coalesce(i.emailAddress, a.emailAddress) ASC
之类内容的查询,它运行良好。如果客户机没有通过分页对象中的任何排序,我就使用这种排序,如果客户机通过了排序,那么我就调用没有这种默认排序的不同版本的查询
但是现在客户机想要对这个emailAddress
属性进行排序,问题就开始了。直接将Pageable
传递给Repository
不起作用,因为没有属性emailAddress
。所以我想不用担心!让我们检查一下我的代码,看看这个属性是否有排序,然后根据参数执行特殊版本的查询
if (pageable.getSort().isSorted()) {
Sort.Order emailAddressOrder = pageable.getSort().getOrderFor("emailAddress");
if (emailAddressOrder != null) {
if (emailAddressOrder.getDirection() == Sort.Direction.ASC)
members = memberRepo.findInProjectDefaultSortAsc(projectId, skipFullName, fullName, pageable);
else
members = memberRepo.findInProjectDefaultSortDesc(projectId, skipFullName, fullName, pageable);
}
else
members = memberRepo.findInProject(projectId, skipFullName, fullName, pageable);
}
else
members = memberRepo.findInProjectDefaultSortAsc(projectId, skipFullName, fullName, pageable);
看起来不是超级混凝土,但应该能正常工作?错误,因为Pageable
仍然包含无效属性emailAddress
那么我该如何移除这个属性呢?我尝试将其强制转换为PageRequest
,但即使是实现对象也不可写。我现在做的是:
PageRequest newPageRequest = PageRequest.of(pageable.getPageNumber(), pageable.getPageSize());
然后我将这个新对象传递到查询中。但这似乎有点容易出错,如果PageRequest实体稍后用其他属性展开,那么我的对象仍然只复制2个属性。这真的是我现在能做的最好的了吗
# 1 楼答案
是的,别担心。你的方法没有错
Pageable
/PageRequest
是不可变的,这实际上是一个很好的实践。使用不可变类时,标准做法是创建具有(可能)修改属性的副本另外,不要担心未来。如果
PageRequest
实体在未来得到扩展,Spring开发人员几乎肯定会让它保持不变。构造函数/工厂方法中将有一个新参数,这将导致编译错误。在升级库的版本时,出现这样的错误是最好的编辑:您还有一个选项:不要将
Sort
嵌入Pageable
。将它们用作两个单独的参数。第一个参数是Pageable
,没有任何排序信息。第二个参数可以是Spring的Sort
,但您也可以自由使用自己的数据类型,例如一些enum