Pregunta sobre join, hibernate – Uniendo dos tablas no relacionadas en hibernación

1

¿Hay alguna manera de que podamos unir dos tablas sin una relación directa entre ellas pero que tengan dos campos comunes en hibernación?

Tengo dos tablas llamadas boiler_plates y perfil sin relación directa entre ellas, pero tengo un campo común llamado contract_id.

Escribí la consulta "desde Boiler_Plates bp internal join Profiles p en bp.bt_contracts = p.contract_id" pero sigue lanzando el error. "token inesperado: en la línea 1 cercana, columna 75 [de com.catapult.bid.model.Boiler_Plates como bp. Unir los perfiles como p en bp.bt_contracts = p.contract_id donde bp.bt_contracts = 1]".

A continuación se muestra el archivo de mapeo de hibernación para placas de caldera y perfiles.

Archivo de mapeo para boiler_plates.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">


<hibernate-mapping package="com.catapult.bid.model"  default-access="field" >
    <class name="Boiler_Plates" table="bt_boiler_plates" schema="bidtool">

        <id name="boiler_plate_id" type="int" column="boiler_plate_id">           
            <generator class="sequence">
                 <param name="sequence">bidtool.boiler_plates_boiler_plate_id_seq</param>
            </generator>
        </id>  

        <property name="boilerPlateName" type="string">
            <column name="boiler_plate_name" length="20" not-null="true" />
        </property>
        <property name="editable" type="int">
            <column name="editable"/>
        </property>
        <property name="boilerPlateContent" type="string">
            <column name="boiler_plate_content" length="20" />
        </property>
        <property name="insertTime" type="date" insert="false">
            <column name="insert_time_stamp"/>
        </property>
         <many-to-one class="Contracts" fetch="select" name="bt_contracts">
             <column name="contract_id"/>
        </many-to-one>
    </class> 
</hibernate-mapping>  

Archivo de mapeo para perfiles

  <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping default-access="field" package="com.catapult.bid.model">
  <class name="Profiles" schema="bidtool" table="bid_tool_profiles">
    <id column="profile_id" name="profileId" type="string">
      <generator class="com.catapult.bid.commons.ProfileIDGenerator"/>
    </id>
    <many-to-one class="User" fetch="select" name="appUsers">
      <column name="user_id"/>
    </many-to-one>
    <property name="profileContent" type="string">
      <column name="profile_content"/>
    </property>
    <property name="scac" type="string">
      <column length="20" name="scac"/>
    </property>
    <property name="created" type="timestamp" update="false">
      <column name="insert_timestamp"/>
    </property>
    <property name="status" type="string">
      <column length="9" name="status" not-null="true"/>
    </property>
    <property name="editable" type="string">
      <column length="1" name="editable" not-null="true"/>
    </property>
  </class>
</hibernate-mapping>

Tu respuesta

2   la respuesta
2

Lo único que puede hacer en tal caso es hacer una unión interna a través de la cláusula where:

select a from A a, B b where a.someColumn = b.someOtherColumn and ...

Las combinaciones adecuadas solo son posibles utilizando asociaciones entre entidades en HQL.

¡Pero esto causará una UNIÓN CRUZADA en el SQL generado! Tarik
0

Debe perezoso obtener Boiler_Plates (su clase no debe tener un guión bajo en el nombre) y Perfiles de Contratos. Entonces usa algo como:

select bp.contracts.profiles from Boiler_Plates bp where bp.boiler_plate_id=?

Tu código usa demasiados guiones bajos, también deberías revisar las convenciones de codificación de Java:http://www.oracle.com/technetwork/java/codeconv-138413.html.

Preguntas relacionadas