连接具有不同连接列名称的两个表

时间:2010-09-03 13:34:19

标签: sql hibernate orm join hibernate-mapping

我有两张桌子A - > B具有多对一映射/关联。

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

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

特别是这可以通过hibernate配置(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>

3 个答案:

答案 0 :(得分:2)

ON条款:

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

答案 1 :(得分:1)

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

  

5.1.12。许多对一

     

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

<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.   
  3. column(可选):外键列的名称。这也可以   由嵌套指定   元件(一个或多个)。
  4.   
  5. class(可选 - 默认为由。确定的属性类型   反思):的名字   相关课程。
  6.   
  7. cascade(可选):指定应该从哪个级联操作   父对象到关联的   对象。
  8.   
  9. fetch(可选 - 默认选择):在outer-join之间选择   提取或顺序选择   取。
  10.   
  11. update,insert(可选 - 默认为true):指定映射   列应包含在SQL中   UPDATE和/或INSERT语句。   将两者都设置为false允许纯粹   “派生”协会的价值是   从另一个属性初始化   映射到相同的列,或通过   触发器或其他应用程序。
  12.   
  13. property-ref(可选):关联类的属性名称   加入这个外键。如果   未指定,主键   使用了相关的类。
  14.   
  15. access(可选 - 默认为property):Hibernate使用的策略   用于访问财产价值。
  16.   
  17. unique(可选):为DDL生成唯一约束   外键列。通过允许   这是一个目标   property-ref,你可以做到   关联多样性一对一。
  18.   
  19. not-null(可选):启用DDL生成可空性   外键的约束   列。
  20.   
  21. optimistic-lock(可选 - 默认为true):指定   是否对此属性进行了更新   要求获得乐观   锁。换句话说,它决定了   应该发生版本增量   这个属性很脏。
  22.   
  23. lazy(可选 - 默认为代理):默认为单点   协会代理。   lazy =“no-proxy”指定   物业应该懒散地取出   实例变量是第一个   访问。这需要构建时间   字节码检测。懒惰=“假”   指定关联将   总是被热切地抓住。
  24.   
  25. not-found(可选 - 默认为exception):指定外键的方式   引用缺少的行将是   处理。忽略会对待失踪   row作为空关联。
  26.   
  27. entity-name(可选):关联类的实体名称。
  28.   
  29. formula(可选):一个定义值的SQL表达式   计算的外键。
  30.   

所以这样的事情应该这样做:

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

参考

答案 2 :(得分:0)

这样的东西?

LEFT JOIN B on A.field1 = B.field2

根据您的口味选择加入类型