如何在jpa中与字段的子实体进行自定义连接?

qgelzfjb  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(278)

嗨,我下面有两个实体表,其中贷款是我的父类和ddl表类是子类。联接是自定义联接。我还有其他子表可以正确连接。但是对于这个ddl表,我想尝试一个自定义连接。我不知道怎样才能做到。下面是我试图实现的oracle查询。我该怎么做。如果这不是正确的方法,欢迎提出建议。
oracle查询

select dt.DESCRIPTION 
from LOANS l,ddl_table dt
where
        dt.table_name='master' and dt.field_name='mc'
        and  SUBSTR(dt.DESCRIPTION, 2, 1) = l.MC_TYPE
        and l.LOAN_ID = :LOAN_ID

父实体

@DynamicUpdate
@Data
@NoArgsConstructor
@ToString
@Table(name = "LOANS")
@Entity
public class Loans {

@Id
@Column(name = "LOAN_ID")
private Long loanId;

@OneToOne(cascade = CascadeType.ALL)
@WhereJoinTable(clause = "table_name='master' and field_name='type'")
private DDLTable  ddlTable;
// Other child tables.
}

ddl表实体

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Table(name = "DDL_TABLE")
@Entity
public class DDLTable {

@Id
@Column(name = "TABLE_NAME")
private String tableName;
@Id
@Column(name = "FIELD_NAME")
private String fieldName;

@Column(name = "DESCRIPTION")
private String description;

@Column(name = "FILTER_TYPE")
private String filterType;

}
58wvjzkj

58wvjzkj1#

是否要(1)在 Loans 以及 DdlTable ,或(2)只执行您发布的查询?
如果是前者,那么只有 dt.table_name='master' and dt.field_name='mc' and SUBSTR(dt.DESCRIPTION, 2, 1) = l.MC_TYPE part成为join子句。你就可以打电话了 em.find(Loans.class, loanId) 以及 Loans.ddlTable 将在结果中填充。你想要的东西大致是:

@OneToOne
@JoinFormula(formula = "SELECT SUBSTR(dt.DESCRIPTION, 2, 1) FROM ddl_table dt WHERE dt.table_name='master' and dt.field_name='mc'", referencedColumnName = "MC_TYPE")

如果是后者,就没有必要 Loans.ddlTable 字段,您的查询可以轻松地转换为jpql:

SELECT dt.description
from Loans l, DdlTable dt
where
        dt.tableName='master' and dt.fieldName='mc'
        and  SUBSTRING(dt.description, 2, 1) = l.mcType
        and l.loanId = :LOAN_ID

顺便说一句,我会考虑Map SUBSTRING(dt.description, 2, 1) 作为数据库中的虚拟列,以简化实体Map。甚至可以看到 dt.tableName='master' and dt.fieldName='mc' . 你可以索引 SUBSTRING(dt.description, 2, 1) 以便更快地查找。

相关问题