java - 连接由控制字段确定的不同表

标签 java mysql hibernate

一共有三个表A和B1、B2:

A(id, b_id, control)
B1(id, other)
B2(id, other)

If control = 1, b_id in A is mapping to table B1;
If control = 2, b_id in A is mapping to table B2.

这三个类是这样的:

@Entity
@Table(name = "A")
public class A {
    @Id
    @Column(name = "id")
    private Integer id;

    private B b;

    @Column(name = "control")
    private Integer control;
} 

@Entity
@Table(name = "B1")
public class B1 {
    @Id
    @Column(name = "id")
    private Integer id;

    @Column(name = "other")
    private Integer other;
}

B2类与B1类几乎相同。

我需要从表 B1 或 B2 中获取由类 A 中的字段 control 确定的不同对象 B。是否可以使用 hibernate 注释来实现?

感谢任何建议。

最佳答案

我认为您错过了在 SQL 中一个表引用另一个表的方式。我的意思是你定义表的方式没有外键也没有 referential integrity安全。我强烈建议您重新考虑您的实现并在 A 表中添加相应的外键。

无论如何,如果你想继续这样下去,你应该看看SQL中的UNION语句。

SELECT A.id, B1.others 
FROM A 
INNER JOIN B1 
ON A.control = 1 AND A.b_id= B1.id
UNION
SELECT A.id, B2.others 
FROM A 
INNER JOIN B2 
ON A.control = 2 AND A.b_id= B2.id

现在我注意到 hql 中的 union 语句存在问题(我认为不支持?)但可能还有其他 implementations .

另请注意,您必须选择相同的列才能联合两个子查询。

关于java - 连接由控制字段确定的不同表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38221321/

相关文章:

php - Laravel date_format 字段验证向后?

mysql - 在一条语句中使用 CONCAT、ROUND、SUM 和 FORMAT

java - SQLQuery 中的 Hibernate 命名参数

java - hibernate 模式验证错误的列但使用正常的 int

java - Java 和 .NET 技术/框架的类似物

java - 如何将 Scala 特征转换为 Java 类?

java - Java 的 `Double.MIN_NORMAL` 和 `Double.MIN_VALUE` 之间的区别?

java - 在一个文件中索引多个文件

mysql - 从 MySQL 查询中删除重复结果

mysql - 在 Restful Web 服务中使用 Hibernate 的 SQL 查询