Java 在响应上应用排序-Spring引导
实际上,我正在返回下面的responsePage-able响应,我想应用列表上的排序 答复: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
{
"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的内置方法,请向我们展示更多类似于您的实体和您尝试过的解决方案的代码。代码清楚地说明了可能出现的问题。好的,让我来分享实体检查更新的代码。。