如何用硬编码值替换@JoinColumn?

amp*_*ent 0 java jpa

有关更多上下文,请参阅我的其他问题

我想将我的Employee实体类加入实体类,Code但代码 PK 是复合的(DOMAIN、CODE),因为它列出了许多不同的代码域,但进入 Employee 类/表中的代码都来自一个域,消除了需要在 Employee 类/表中有一个域字段(因为它总是相同的)。

我可以加入员工代码通过在使用CODE字段员工表和一个硬编码值(例如EMP_TYPE),而不是冗余列?

如果我的Employee类/表确实有那个多余的列,我会像这样加入它:

@JoinColumns({
        @JoinColumn(name = "EMP_TYPE_CODE", referencedColumnName = "CODE"),
        @JoinColumn(name = "DOMAIN", referencedColumnName = "DOMAIN)})
    @ManyToOne(optional = false)
    private Code sharedStatute;
Run Code Online (Sandbox Code Playgroud)

但我真的不想在数据库和班级中有额外的列,因为它总是相同的。

我想要完成的将相当于 SQL 中的以下内容:

SELECT e.emp_id, e.first_name, e.last_name, c.description as emp_type
FROM Employee e JOIN Code c
ON e.emp_type_code = c.code
WHERE c.domain = 'EMP_TYPE'
Run Code Online (Sandbox Code Playgroud)

domain在 Employee 表中添加一个字段并使用相同的值 ('EMP_TYPE') 填充 EVERY SINGLE RECORD 然后执行以下操作相反:

SELECT e.emp_id, e.first_name, e.last_name, c.description as emp_type
FROM Employee e JOIN Code c
ON e.emp_type_code = c.code
AND e.domain = c.domain
Run Code Online (Sandbox Code Playgroud)

前者效率更高,因为它使我不必拥有冗余字段。所以我想做的是同样的事情,但在JPA.

你们中的一些人可能会说“为什么不为每个代码有一个单独的查找表”,但我认为这是一个糟糕的主意,会导致数据库表和相应的应用程序实体混乱。有一个按代码类型(或域)分区的单个代码查找表要好得多。

Aff*_*ffe 6

这应该有效吗?

@JoinColumn(name = "EMP_TYPE_CODE", referencedColumnName = "CODE")
@Where(clause = "domain = 'EMP_TYPE'")
@ManyToOne(optional = false)
private Code sharedStatute;
Run Code Online (Sandbox Code Playgroud)

  • 我能想到的唯一方法是将“EmployeeDomainCode”作为“Code”的子类,并使用 Domain 列作为鉴别器值。 (2认同)