有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    是的,别担心。你的方法没有错Pageable/PageRequest是不可变的,这实际上是一个很好的实践。使用不可变类时,标准做法是创建具有(可能)修改属性的副本

    另外,不要担心未来。如果PageRequest实体在未来得到扩展,Spring开发人员几乎肯定会让它保持不变。构造函数/工厂方法中将有一个新参数,这将导致编译错误。在升级库的版本时,出现这样的错误是最好的

    编辑:您还有一个选项:不要将Sort嵌入Pageable。将它们用作两个单独的参数。第一个参数是Pageable,没有任何排序信息。第二个参数可以是Spring的Sort,但您也可以自由使用自己的数据类型,例如一些enum