Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何编辑Spring可分页对象?_Java_Spring_Hibernate_Spring Data Jpa_Jpql - Fatal编程技术网

Java 如何编辑Spring可分页对象?

Java 如何编辑Spring可分页对象?,java,spring,hibernate,spring-data-jpa,jpql,Java,Spring,Hibernate,Spring Data Jpa,Jpql,我需要能够编辑一个可分页的对象,更具体地说是其中的一种 我有一些DTO成员,它有一个属性电子邮件地址。客户不知道,这是通过查询从两个不同实体收集的信息,Account或Invite。成员始终具有以下任一项。 这已经足够好了,我在repo中执行标准JPA查询,并在将其转换为DTO之前收集所需信息 现在我们要根据这个引用的属性进行排序。那很好。我可以创建一个查询,其中包含类似于orderbycoalesce(I.emailAddress,a.emailAddress)的ASC,效果很好。如果客户机没

我需要能够编辑一个可分页的对象,更具体地说是其中的一种

我有一些DTO
成员
,它有一个属性
电子邮件地址
。客户不知道,这是通过查询从两个不同实体收集的信息,
Account
Invite
成员始终具有以下任一项。
这已经足够好了,我在repo中执行标准JPA查询,并在将其转换为DTO之前收集所需信息

现在我们要根据这个引用的属性进行排序。那很好。我可以创建一个查询,其中包含类似于
orderbycoalesce(I.emailAddress,a.emailAddress)的ASC
,效果很好。如果客户机没有通过分页对象中的任何排序,我就使用这种排序,如果客户机通过了排序,那么我调用没有这种默认排序的不同版本的查询

但是现在客户机想要在这个
emailAddress
属性上排序,问题就开始了。直接将
Pageable
传递到
存储库
不起作用,因为没有属性
电子邮件地址
。所以我想不用担心!让我们检查一下我的代码,看看这个属性是否有排序,然后根据参数执行特殊版本的查询

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个属性。这真的是我现在能做的最好的了吗?

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

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


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

我喜欢编辑中的想法。你的意思是我可以把一个额外的排序传递到存储库中,对吗?还是我看错了?这是否意味着页面中的排序信息会被忽略?因为Spring MVC通过sorting.Yes将该对象直接插入到我的请求方法中,
PageAble
将保存
org.springframework.data.domain.Sort#UNSORTED
的实例,Spring实际上会忽略该实例。