Java 在响应上应用排序-Spring引导

Java 在响应上应用排序-Spring引导,java,hibernate,spring-boot,jpa,pageable,Java,Hibernate,Spring Boot,Jpa,Pageable,实际上,我正在返回下面的responsePage-able响应,我想应用列表上的排序 答复: { "body": { "totalCount": 500, "success": true, "data": [ { "id": 3361, "displayName": "Kim", "events": 57 }, { "id": 3

实际上,我正在返回下面的responsePage-able响应,我想应用列表上的排序

答复:

{
"body": {
    "totalCount": 500,
    "success": true,
    "data": [
        {
            "id": 3361,
            "displayName": "Kim",
            "events": 57
        },
        {
            "id": 3361,
            "displayName": "Sagar",                
            "events": 57
        },
        {
            "id": 3361,
            "displayName": "Jam",
            "events": 57
        },
        {
            "id": 4779,
            "displayName": "Inga",
            "events": 36
        },
        {
            "id": 4779,
            "displayName": "Mine",
            "events": 36
        },
        {
            "id": 4779,
            "displayName": "Joseph",
            "events": 36
        },
        {
            "id": 3883,
            "displayName": "Amy",
            "events": 10
        },
        {
            "id": 14984,
            "displayName": "Test20",
            "events": 8
        },
        {
            "id": 14984,
            "displayName": "Test20",
            "events": 8
        },
        {
            "id": 14984,
            "displayName": "Test20",
            "events": 8
        },
        {
            "id": 14984,
            "displayName": "Test20",
            "events": 8
        },
        {
            "id": 14984,
            "displayName": "Test20",
            "events": 8
        },
        {
            "id": 14984,
            "displayName": "Test20",
            "events": 8
        },
        {
            "id": 14984,
            "displayName": "Test20 21",
            "events": 8
        },
        {
            "id": 4841,
            "displayName": "Patricia",
            "events": 7
        },
        {
            "id": 3364,
            "displayName": "tutsman",
            "events": 4
        },
        {
            "id": 3364,
            "displayName": "Jaan",
            "events": 4
        }
    ]
},
"statusCode": 200
}
所以问题是,当我请求API和displayName或id上的sort时,它工作了,但在事件中它不工作

PS:我知道它不起作用的原因,因为事件显示了事件的大小,它已经是一个实体,所以我的实体中没有任何大小列。我只是加入表并获取总事件,在显示之后,响应中事件的大小,以及可分页的基本特性(对响应进行排序)必须是将列放入实体中,但在我的例子中,我只是计算大小

尝试过的解决方案:

我尝试使用stream函数在facadeinpl中对响应进行排序,它只对特定页面有效,但当我请求另一个页面排序时,再次失败

PS:所以我必须在DB级别对元素进行排序,但在DB中,我的表中没有任何大小列

请求url:

localhost:8080/users/3?page=0&size=20&sort=events,desc
代码:

@Entity
@Access(AccessType.FIELD)
public class Users Serializable {
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
    private List<Event> events;   

    @Column(name = "first_name")
    private String firstName;

    //below are the getter and the setters    
}
服务级别:

我使用JPARepo代替crud,并使用内置方法Findall

@Override
@Transactional(readOnly = true)
public Page<Users> find(Filter filter,Pageable pageable) {
    var clientSpecification = specificationGenerator.getClientSpecification(filter);
    return clientDao.findAll(clientSpecification, pageable);
}

一种解决方案是创建聚合数据的数据库视图,并通过@SecondaryTable将实体链接到该视图

例如:

    create view a_summary_view as
    select
   a_id as id, 
   count(*) as b_count 
from b -- where a is your User Entity and b is Events entity
然后:

@Entity
@Table
@SecondaryTable(name = "a_summary_view", 
       pkJoinColumns = {@PrimaryKeyJoinColumn(name = "id", referencedColumnName= "id")})
public class Users{

   @Column(table = "a_summary_view")
   private Integer eventCount;    
 }

通过这种方式,您将在用户实体中有一个字段进行排序

如果您没有向我们展示执行查询的代码,请将您的存储库函数添加到您的问题中,这样我们就可以看到您在服务类中简单地称为jpa findAll的内置方法,请向我们展示更多类似于您的实体和您尝试过的解决方案的代码。代码清楚地说明了可能出现的问题。好的,让我来分享实体检查更新的代码。。