首页 > 解决方案 > Spring数据——按不同命名的复合主键排序

问题描述

我有一个复合主键定义为的实体

@Embeddable
public class EntityPk {

    @Column(updatable = false, nullable = false)
    Long theNum;

    @Column(updatable = false, nullable = false)
    Type theType;
}

和实体

@Entity
@Table(name = "entityXyz")
@EntityListeners(AuditingEntityListener.class)
@DynamicUpdate
@DynamicInsert
public class Entity {

    @EmbeddedId
    EntityPk pk;

    @Column(nullable = false)
    String something;
....
}

我们有一个发送以下请求的前端应用程序

{
    ...
    "sort": {
        "field": "theNum",
    }
    ...
}

随后在使用 sort 参数调用 pageable 之后:

repository.findAll(spec, pageable)

失败了

org.springframework.data.mapping.PropertyReferenceException:找不到类型实体的属性 theNum!

这可以通过发送正确的请求来轻松解决,例如:

{
    ...
    "sort": {
        "field": "pk.theNum", // notice the added prefix "pk."
    }
    ...
}

最后我的问题是 - 有没有办法告诉 spring 将接收到的“theNum”排序参数正确地视为复合主键的一部分?

或者我应该a)更改来自前端的请求或b)为实体编写自定义转换器?

标签: spring-data-jpaspring-data

解决方案


我最终编写了一个简单的转换器,它检查查询应该排序的字段的名称并预先添加

PK。

它的名字。不过有一件事 - 为了确保您比较正确的字段名称,应该使用静态元模型生成器,例如

https://docs.jboss.org/hibernate/orm/5.4/topical/html_single/metamodelgen/MetamodelGenerator.html

虽然这是更优雅的解决方案,但在使用 Springframework Page 对象时不将具有复合主键的实体的路径暴露给前端


推荐阅读