一尘不染

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

hibernate

我正在使用Spring&Hibernate开发webapp。

表1:基本表

+------------+--------------+------+-----+---------+----------------+
| 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   |         |                |
+------------+--------------+------+-----+---------+----------------+

表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   |         |                |
+------------+--------------+------+-----+---------+----------------+

我需要基于序列表。该SerialTable2可能包含的值从任一Serial1Serial2来自Table1所以应该比较喜欢OR运算符。我正在将hbm.xml用于表。没有注释映射。我加入了像这样的表:

<one-to-one name="notes"
    class="Notes" entity-name="Notes">
</one-to-one>

我之前使用过此查询:

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

我浏览了此http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/associations.html,但仅使用了1个关键列。

在这种情况下,如何使用HBM.XML加入?可能吗?


阅读 257

收藏
2020-06-20

共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;

然而,加入公式似乎是hibernate的时间是非常脆弱的(我设法使这项工作只为许多-to-
one关联,我不得不作出Entity2执行Serializable;否则,它不工作,并投掷了一些奇怪的NullPointer-ClassCastException为s)。

2020-06-20