spring-data-jpa - 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)为实体编写自定义转换器?
解决方案
我最终编写了一个简单的转换器,它检查查询应该排序的字段的名称并预先添加
PK。
它的名字。不过有一件事 - 为了确保您比较正确的字段名称,应该使用静态元模型生成器,例如
https://docs.jboss.org/hibernate/orm/5.4/topical/html_single/metamodelgen/MetamodelGenerator.html
虽然这是更优雅的解决方案,但在使用 Springframework Page 对象时不将具有复合主键的实体的路径暴露给前端
推荐阅读
- php - 在 PayPal 中,是否可以从他的电子邮件地址中获取买家的送货地址?
- java - float 和 int 之间的除法不会编译
- python - Keras和熊猫系列
- java - Spring Boot 无法正确呈现视图
- javascript - 可调整大小和响应式面板布局?
- graphql - graphql-php 入门:如何将解析器函数从 .graphql 文件添加到模式?
- c - fprintf 将整数和字符的内容打印到文件中
- python - pygame窗口一直没有响应
- javascript - JavaScript 设置。大脑js
- java - RxJava 无法将一个列表转换为另一个列表