Java 使用Spring JPA排序时如何将客户端与实体变量名解耦

Java 使用Spring JPA排序时如何将客户端与实体变量名解耦,java,spring,sorting,spring-data-jpa,Java,Spring,Sorting,Spring Data Jpa,我使用SpringJPAPageable来管理端点的分页和排序。问题是客户端应该使用与JPA实体名称相同的变量名称进行排序,以便JPA能够接受排序请求。但是,我正在尝试将请求中的排序与实体解耦,因此如果重命名实体变量,则不会对请求参数产生影响 @Entity class Example { @Id @GeneratedValue @Column(nullable = false) private Long id; @Column(nullable =

我使用SpringJPAPageable来管理端点的分页和排序。问题是客户端应该使用与JPA实体名称相同的变量名称进行排序,以便JPA能够接受排序请求。但是,我正在尝试将请求中的排序与实体解耦,因此如果重命名实体变量,则不会对请求参数产生影响

@Entity
class Example {

    @Id
    @GeneratedValue
    @Column(nullable = false)
    private Long id;

    @Column(nullable = false)
    private String firstName;

    @Column(nullable = false)
    private String lastName;


    // constructor, getters etc.
}


// controller
@GetMapping("/examples")
public ResponseEntity<ExampleResponseModel> getAllExamples(
      @RequestParam(required = false, defaultValue = "1") int pageNum,
      @RequestParam(required = false, defaultValue = "10") int pageSize,
      @RequestParam(required = false, defaultValue = "firstName, lastName") String[] sortFields,
      @RequestParam(required = false, defaultValue = "asc") String sortOrder {
    Page<Example> pages = repository.findAll(PageRequest
            .of(pageNum - 1, pageSize, Sort.by(Direction.fromString(sortOrder), sortFields)));
    return new ResponseEntity<>(pages, HttpStatus.OK);
}
@实体
课例{
@身份证
@生成值
@列(nullable=false)
私人长id;
@列(nullable=false)
私有字符串名;
@列(nullable=false)
私有字符串lastName;
//构造函数、getter等。
}
//控制器
@GetMapping(“/examples”)
公众反应(
@RequestParam(必需=false,defaultValue=“1”)int pageNum,
@RequestParam(必需=false,defaultValue=“10”)int pageSize,
@RequestParam(required=false,defaultValue=“firstName,lastName”)字符串[]sortFields,
@RequestParam(required=false,defaultValue=“asc”)字符串排序器{
Page pages=repository.findAll(PageRequest
.of(pageNum-1,pageSize,Sort.by(Direction.fromString(sortOrder),sortFields));
返回新的响应属性(第页,HttpStatus.OK);
}

一种方法是在中间实现映射,将请求模型排序字段名转换为实体字段名。然而,这将是非常冗长的,并且不能解决实体类中字段名称的排序敏感性。我的主要目标是在排序和MA时将客户机与实体完全解耦。确保如果其他开发人员将

Example
类的
firstName
变量重命名为
firstName
,排序不会中断(或者至少他会收到一个编译时错误,通知他修复).

如果您使用分页和排序,我猜您的前端有一个网格或类似的东西。如果是这样,您可以创建自己的注释,该注释将保留属性的元名称,无论发生什么都不会更改。
之后,您应该在控制器中创建一个新的
GET
方法,该方法将请求通过反射读取所有图元及其真实名称。进入网格选项卡或其他任何内容,front应该首先检查其存储,查找
示例
实体的图元。如果成功,只需获取此数据并在请求中使用,如果不是,则请求新端点获取具有映射实名的Meta并存储它,然后才发出排序和分页请求。如果前后独立,则在后端启动时添加Meta的实现。

'确保如果另一个开发人员将示例类的firstName变量重命名为firstName,则排序不会发生。break'-我的意思是,如果您从控制器返回实体,通常不只是排序会在属性重命名时中断。那么,问题是,是否真的值得努力防止排序属性名称更改。我建议使用API契约测试套件,以确保属性名称不会更改d不小心。@crizzis我删除了服务层和相应的模型以简化代码段,所以实体通常是解耦的,但排序时不是这样。我不确定我是否能准确理解你的建议。你能通过分享一个例子来详细说明吗?