如何通过JPA Specification访问关联实体嵌入主键中的字段
错误原因
JPA Criteria API 的get()方法不支持直接传入带.的嵌套属性路径访问嵌入ID中的字段,需要分层获取嵌套属性。
正确写法
1. 硬编码属性名写法
return (root, query, criteriaBuilder) -> { Join<Parent, Child> join = root.join("child"); // 先获取EmbeddedId字段,再获取id内的type属性 return criteriaBuilder.equal(join.get("id").get("type"), val); };
2. 静态元模型推荐写法(避免硬编码字符串出错)
如果项目已生成JPA静态元模型,可使用类型安全的写法:
return (root, query, criteriaBuilder) -> { Join<Parent, Child> join = root.join(Parent_.child); return criteriaBuilder.equal(join.get(Child_.id).get(ChildId_.type), val); };
注意检查点
- 确认Child实体的主键字段加了
@EmbeddedId注解,对应的嵌入式ID类实现了Serializable接口,类内type字段名拼写正确 - 确认Parent实体中关联Child的属性名确实为
child,一对一映射配置无误
内容的提问来源于stack exchange,提问作者ANKIT PRASAD
相关产品推荐
相关产品推荐

