Hibernate - 有没有办法将2列与1连接?

Vig*_*esh 6 java mysql spring hibernate join

我正在使用Spring和Hibernate开发webapp.

表1:BaseTable

+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| Id         | bigint(20)   | NO   | PRI |         | auto_increment |
| Serial1    | varchar(255) | YES  |     | NULL    |                |
| Serial2    | varchar(255) | YES  |     | NULL    |                |
| ModelNum   | varchar(255) | YES  |     | NULL    |                |
| ...        | ....         | ..   | 0   |         |                |
+------------+--------------+------+-----+---------+----------------+ 
Run Code Online (Sandbox Code Playgroud)

表2:DetailTable

+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| Id1        | varchar(20)  | NO   | PRI |         |                |
| Id2        | varchar(20)  | NO   | PRI |         |                |
| Id3        | varchar(20)  | NO   | PRI |         |                |
| Serial     | varchar(255) | YES  |     | NULL    |                |
| ...        | ....         | ..   | 0   |         |                |
+------------+--------------+------+-----+---------+----------------+
Run Code Online (Sandbox Code Playgroud)

我需要根据连续出版物加入表格.该SerialTable2可能包含的值从任一Serial1Serial2来自Table1所以应该比较喜欢OR运算符.我正在使用hbm.xml表.没有注释映射.我加入了以下表:

<one-to-one name="notes"
    class="Notes" entity-name="Notes">
</one-to-one>
Run Code Online (Sandbox Code Playgroud)

我之前使用过这个查询:

SELECT A.* FROM Table2 As a INNER JOIN Table1 As b 
ON (a.Serial = b.Serial1 or a.Serial = b.Serial2);
Run Code Online (Sandbox Code Playgroud)

我浏览了这个http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/associations.html,但只使用了一个关键列.

如何在此方案中使用HBM.XML加入?可能吗?

Dra*_*vic 1

解决方案1

Table1创建一个公开外键引用的数据库视图Table2。从您发布的查询中投影外键,您无论如何都会将其用于视图。然后将您的实体映射到视图。

解决方案2

使用连接公式

例如,在映射的实体中Table1定义与映射到的实体的多对一关联Table2(似乎是您的用例):

@ManyToOne
@JoinColumnsOrFormulas({
      @JoinColumnOrFormula(formula=@JoinFormula(value="(SELECT t2.serial FROM Table2 t2 WHERE serial1 = t2.serial OR serial2 = t2.serial)", referencedColumnName="serial"))
    })
private Entity2 entity2;
Run Code Online (Sandbox Code Playgroud)

然而,连接公式目前在 Hibernate 中似乎非常脆弱(我设法使这项工作仅适用于多对一关联,并且我必须实现Entity2Serializable否则它不起作用并抛出一些奇怪的NullPointer-ClassCastExceptions)。