java Spring JPA REST按嵌套属性排序
我有实体Market
和Event
Market
实体有一列:
@ManyToOne(fetch = FetchType.EAGER)
private Event event;
接下来,我有一个存储库:
public interface MarketRepository extends PagingAndSortingRepository<Market, Long> {
}
和一个投影:
@Projection(name="expanded", types={Market.class})
public interface ExpandedMarket {
public String getName();
public Event getEvent();
}
使用REST查询/api/markets?projection=expanded&sort=name,asc
我成功地获得了按市场名称排序的具有嵌套事件属性的市场列表:
{
"_embedded" : {
"markets" : [ {
"name" : "Match Odds",
"event" : {
"id" : 1,
"name" : "Watford vs Crystal Palace"
},
...
}, {
"name" : "Match Odds",
"event" : {
"id" : 2,
"name" : "Arsenal vs West Brom",
},
...
},
...
}
}
但我需要的是按照事件名称获取市场排序列表,我尝试了查询/api/markets?projection=expanded&sort=event.name,asc
,但没有成功。我该怎么做才能让它工作
# 1 楼答案
从Spring数据REST文档:
https://docs.spring.io/spring-data/rest/docs/current/reference/html/#paging-and-sorting.sorting
我发现的另一种选择是使用
@ResResource(exported=false)
。 这是无效的(特别是对于旧式Spring数据REST项目),因为要避免资源/实体将加载HTTP链接:我尝试在注释的帮助下激活可链接的排序关联,但没有成功,因为我们总是需要重写
JacksonMappingAwareSortTranslator.SortTranslator
的mappPropertyPath
方法来检测注释:注释
在您的项目中,包括排序为什么的可链接关联
实际上,我并没有找到一个明确而成功的解决方案来解决这个问题,但我决定公开它,让大家思考一下,甚至让Spring团队考虑在nexts发行版中加入它
# 2 楼答案
这个page有一个可行的想法。其思想是在存储库顶部使用一个控制器,并分别应用投影
下面是一段有效的代码(SpringBoot 2.2.4)
# 3 楼答案
您的
MarketRepository
可以有一个类似named query
的:您可以通过
@RequestParam
从url获取name
参数# 4 楼答案
只需降级
spring.data.rest.webmvc
到Hopper
发布谢谢@Alan Hay对this question的评论
顺便说一句,我试过^{} ,报告说已经修复了,但没有与我一起工作
# 5 楼答案
我们曾经遇到过这样一种情况:我们想按链接实体中的字段进行排序(这是一对一的关系)。最初,我们使用基于https://stackoverflow.com/a/54517551的示例按链接字段进行搜索
因此,在我们的案例中,解决方法/技巧是提供自定义排序和可分页参数。 下面是一个例子:
使用过的Spring boot版本:2.3.8。释放
我们还拥有实体和投影的存储库: