【问题标题】:joining two tables with differnt join column names连接两个具有不同连接列名的表
【发布时间】:2011-04-07 20:48:03
【问题描述】:

我有两个表 A -> B 具有多对一映射/关联。

表B的主键是表A的外键。

问题是两个表中的列名不同。假设 B 具有主键列“typeNumId”,它是表 A 中的外键作为“类型”。如何在此列上加入两个表?如何指定映射以指示表必须加入“typeNumId”和“type”,这基本上是相同的。

尤其是这可以通过休眠配置(hbm 文件)实现吗?

类似

<many-to-one name="Type" class="com.domain.ProcedureType" update="false" insert="false" fetch="join" lazy="false">
    <column name="? <this is in questions? >" not-null="true" />
</many-to-one>

【问题讨论】:

  • 我认为您的大部分 XML 示例都丢失了 html 剥离,尝试将其缩进四个空格(或单击“代码”按钮)。

标签: sql hibernate orm join hibernate-mapping


【解决方案1】:

这样的?

LEFT JOIN B on A.field1 = B.field2

根据您的喜好选择 JOIN 类型

【讨论】:

    【解决方案2】:

    ON 子句:

    select * from A join B on A.type = B.typeNumId
    

    【讨论】:

    • 其实我理解的问题是关于如何写映射。
    • @Pascal Thivent:当然。我在提到 Hibernate 之前回答了 q,而且由于我不知道 Hibernate,所以我无法真正重新回答 ... ;)
    • 啊,我没有注意到 OP 更新了问题。现在说得通了。
    【解决方案3】:

    您使用many-to-one 元素的column 属性或等效的嵌套column 元素声明外键的名称。来自文档:

    5.1.12。多对一

    与另一个的普通关联 持久类是使用一个声明的 多对一元素。关系型 模型是多对一的关联;一种 一张表中的外键是 引用主键列 目标表。

    <many-to-one
            name="propertyName"                                          (1)
            column="column_name"                                         (2)
            class="ClassName"                                            (3)
            cascade="cascade_style"                                      (4)
            fetch="join|select"                                          (5)
            update="true|false"                                          (6)
            insert="true|false"                                          (6)
            property-ref="propertyNameFromAssociatedClass"               (7)
            access="field|property|ClassName"                            (8)
            unique="true|false"                                          (9)
            not-null="true|false"                                        (10)
            optimistic-lock="true|false"                                 (11)
            lazy="proxy|no-proxy|false"                                  (12)
            not-found="ignore|exception"                                 (13)
            entity-name="EntityName"                                     (14)
            formula="arbitrary SQL expression"                           (15)
            node="element-name|@attribute-name|element/@attribute|."
            embed-xml="true|false"
            index="index_name"
            unique_key="unique_key_id"
            foreign-key="foreign_key_name"
    />
    
    1. name:属性的名称。
    2. column(可选):外键列的名称。这也可以 由嵌套指定 元素。
    3. 类(可选 - 默认为由 反射):名称 关联类。
    4. cascade(可选):指定哪些操作应该从 关联的父对象 对象。
    5. fetch(可选 - 默认选择):在外连接之间进行选择 获取或顺序选择 正在抓取。
    6. 更新、插入(可选 - 默认为 true):指定映射的 列应包含在 SQL 中 UPDATE 和/或 INSERT 语句。 将两者都设置为 false 允许纯 “派生”关联,其值为 从另一个属性初始化 映射到相同的列,或由 触发器或其他应用程序。
    7. property-ref(可选):关联类的属性名称 连接到这个外键。如果 未指定,主键 使用关联类。
    8. access(可选 - 默认为属性):Hibernate 使用的策略 用于访问属性值。
    9. unique(可选):启用 DDL 生成唯一约束 外键列。通过允许 这是一个目标 property-ref,你可以使 关联多重性一对一。
    10. not-null(可选):启用 DDL 生成可空性 外键约束 列。
    11. optimistic-lock(可选 - 默认为 true):指定 对此属性的更新做或不做 需要获得乐观的 锁。换句话说,它确定是否 版本增量应该发生在 这个属性很脏。
    12. lazy(可选 - 默认为代理):默认为单点 关联被代理。 lazy="no-proxy" 指定 属性应该被懒惰地获取 实例变量是第一个 访问。这需要构建时间 字节码检测。懒惰=“假” 指定关联将 总是渴望得到。
    13. not-found(可选 - 默认为异常):指定如何使用外键 参考缺失的行将是 处理。忽略将处理丢失 行作为空关联。
    14. entity-name(可选):关联类的实体名称。
    15. 公式(可选):定义值的 SQL 表达式 计算的外键。

    所以应该这样做:

    <many-to-one name="Type" class="com.domain.ProcedureType" update="false" insert="false" fetch="join" lazy="false">
        <column name="type" not-null="true" />
    </many-to-one>
    

    参考

    【讨论】:

      猜你喜欢
      • 2017-06-18
      • 1970-01-01
      • 2021-11-25
      • 2012-01-09
      • 1970-01-01
      • 1970-01-01
      • 2014-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多