如何映射无关联关系的JPA实体并获取对应查询结果
解决方案
针对你使用Hibernate 5.4.32版本、两个无关联JPA实体需要在LoanOrder中加载指定查询结果的需求,有以下3种可行实现方式:
方案1:JPA标准@PostLoad回调(通用无框架依赖)
这是最符合JPA规范的实现,不需要依赖Hibernate特有特性,原理是在LoanOrder实体加载完成后自动执行指定查询,填充ddlTables属性。
实现代码
@Entity @Table(name = "XYZ_EC") public class LoanOrder{ @Id UUID id; @Transient // 标注为非持久化字段,避免JPA做默认映射 public List<DDLTable> ddlTables; // 实体加载完成后自动触发执行 @PostLoad public void loadDdlTables() { // 可通过工具类获取当前线程绑定的EntityManager,Spring环境可直接注入 EntityManager em = EntityManagerUtil.getCurrentEntityManager(); TypedQuery<DDLTable> query = em.createQuery( "select d from DDLTable d where d.tableName = 'ABC'", DDLTable.class ); this.ddlTables = query.getResultList(); } }
方案2:Hibernate特有@JoinFormula关联映射(自动加载支持懒加载)
如果可以使用Hibernate特有注解,通过@JoinFormula定义固定关联条件,直接用@OneToMany映射即可,不需要手动写查询逻辑,Hibernate会自动完成关联加载,性能更优。
实现代码
@Entity @Table(name = "XYZ_EC") public class LoanOrder{ @Id UUID id; @OneToMany(fetch = FetchType.LAZY) // 可按需指定立即加载/懒加载 @JoinFormula(value = "'ABC'", referencedColumnName = "TABLE_NAME") // value为关联条件固定值需加单引号,referencedColumnName对应DDLTable的关联字段 public List<DDLTable> ddlTables; }
提示:如果查询条件不是固定值,而是和LoanOrder自身的某个表字段对应,只需把
@JoinFormula的value改为LoanOrder表中对应的字段名(去掉单引号),即可实现动态关联。
额外注意事项
你当前的DDLTable实体使用了三个@Id注解定义复合主键,需要补充定义复合主键类,否则JPA启动会报错,修正后的代码如下:
@Table(name = "DDL_TABLE") @Entity @IdClass(DDLTableId.class) // 新增复合主键类注解 public class DDLTable implements Serializable { @Id @Column(name = "TABLE_NAME") private String tableName; @Id @Column(name = "DESCRIPTION") private String description; @Id @Column(name = "FILTER_TYPE") private String filterType; // 省略getter、setter } // 复合主键类 public class DDLTableId implements Serializable { private String tableName; private String description; private String filterType; // 省略getter、setter、equals、hashCode方法,这三个方法必须实现 }
内容的提问来源于stack exchange,提问作者VKP
相关产品推荐
相关产品推荐

