Hibernate 正在寻找一种方法,将实体名称前缀动态添加到可分页排序.Order对象中指定的嵌套实体属性

Hibernate 正在寻找一种方法,将实体名称前缀动态添加到可分页排序.Order对象中指定的嵌套实体属性,hibernate,sorting,spring-data-jpa,foreign-keys,entity,Hibernate,Sorting,Spring Data Jpa,Foreign Keys,Entity,在我的应用程序中,我通过HTTP请求参数将排序参数从UI传递给Spring数据Rest应用程序。我的JPA存储库实体中有@ManyToOne实体。我发送回UI的数据是从这些嵌套实体(员工、联系人、业务线)的属性中检索的,如下所示。我使用来自UI的排序参数创建了一个可分页对象。我不想在应用程序中手动将实体别名硬编码到排序参数。你知道我怎么做吗 Page<BusContact> contacts = busContactRepository.findAll(pageable); 排序参

在我的应用程序中,我通过HTTP请求参数将排序参数从UI传递给Spring数据Rest应用程序。我的JPA存储库实体中有@ManyToOne实体。我发送回UI的数据是从这些嵌套实体(员工、联系人、业务线)的属性中检索的,如下所示。我使用来自UI的排序参数创建了一个可分页对象。我不想在应用程序中手动将实体别名硬编码到排序参数。你知道我怎么做吗

Page<BusContact> contacts = busContactRepository.findAll(pageable);
排序参数不起作用

employeeNumber: ASC
company: ASC
我必须手动确定哪个实体具有sort属性,并在创建sort.Order对象以传递到Pageable时添加实体别名

new Sort.Order(Sort.Direction.fromString(sortProps[1].trim()), "employee."+sortProps[0].trim())
类似地,对于我要排序的实体“contact”和“businessLine”中的属性


我尝试的解决方案之一是使用存储库和实体元数据来确定哪个实体具有该属性,然后动态添加实体名称作为别名。但是,到目前为止,获取元数据的尝试是相当具有挑战性的。我尝试过存储库,DefaultRepositoryMetadata。只是张贴在这里,看看你是否有更好的解决方案。谢谢。

我找到的最接近的解决方案是从正在使用的存储库中确定实体,并检查实体字段以确定哪一个字段与请求的排序参数匹配,然后向其添加相应的实体前缀

为了找到实体信息,一种方法是利用SimpleParepository的getDomainClass()保护方法。但是由于这个方法是受保护的,我们可以通过扩展这个类并将应用程序配置为使用我们扩展的SimpleParepository实现来公开这些细节

我发现下面的链接详细介绍了如何扩展SimpleParepository

employeeNumber: ASC
company: ASC
new Sort.Order(Sort.Direction.fromString(sortProps[1].trim()), "employee."+sortProps[0].trim())