简体   繁体   中英

Hibernate HQL many to one join

i have 2 tables in mysql, blocked_histories and blocked_detail_histories . The block_detail_histories table has many-to-one hibernate relationship to block_histories. the table creation scripts looks like this

blocked_histories

CREATE TABLE `blocked_histories` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `type` VARCHAR(32) NOT NULL,
  `no_ecash` varchar(13) NOT NULL,
  `cif` VARCHAR(32) DEFAULT NULL,
  `reason_id` INT(4) NOT NULL,
  `desc` TEXT,
  `status` VARCHAR(32) NOT NULL,
  `created_date` DATETIME NOT NULL,
  `created_by` VARCHAR(100) NOT NULL,
  `total_balance` DECIMAL(15,6) NOT NULL,
  `broker` int(11) NOT NULL,
  `blocked_id` INT(11) NOT NULL UNIQUE,
  `remark` text,
  PRIMARY KEY (`id`),
    CONSTRAINT `CUSTOMFIELD_ID_FK` FOREIGN KEY (`reason_id`) REFERENCES `custom_field_possible_values` (`id`)
)  ENGINE=INNODB AUTO_INCREMENT=312 DEFAULT CHARSET=latin1;

blocked_detail_histories

CREATE TABLE `blocked_detail_histories` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `blocked_id` INT(11) NOT NULL,
  `no_ecash` VARCHAR(13) DEFAULT NULL,
  `prev_group` INT(11) NOT NULL,
  `balance` DECIMAL(15,6) NOT NULL,
  PRIMARY KEY (`id`),
   KEY `BLOCKED_ID_FK` (`blocked_id`),
   CONSTRAINT `BLOCKED_ID_HISTORIES_FK` FOREIGN KEY (`blocked_id`) REFERENCES `blocked_histories` (`blocked_id`)
)  ENGINE=INNODB AUTO_INCREMENT=312 DEFAULT CHARSET=latin1;

and the hibernate mapping looks like this

blocked_histories

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

    <class dynamic-insert="true" dynamic-update="true"
        name="nl.strohalm.cyclos.entities.groups.BlockedHistories"
        table="blocked_histories">
        <id name="id" type="long">
            <column name="id" sql-type="bigint" />
            <generator class="native" />
        </id>
        <property name="type" column="type" type="string" not-null="true" length="32" />
        <property name="noEcash" column="no_ecash" type="string" not-null="true" length="13" />
        <property name="cif" column="cif" type="string" length="32" />

        <!--  <property name="reasonId" column="reason_id" type="int" not-null="true" length="11" /> -->
        <many-to-one name="reasonId" class="nl.strohalm.cyclos.entities.customization.fields.CustomFieldPossibleValue">
            <column name="reason_id" sql-type="integer"></column>
        </many-to-one>

        <property name="desc" column="desc" type="text" not-null="true" />
        <property name="status" column="status" type="string" length="32" />
        <property name="createdDate" column="created_date" type="calendar" not-null="true" />
        <property name="createdBy" column="created_by" type="string" not-null="true" length="100"/>
        <property name="totalBalance" column="total_balance" type="big_decimal" not-null="true" precision="15" scale="6" />
        <property name="brokerId" column="broker" type="int" not-null="true" length="11" />
        <property name="remark" column="remark" type="text" />
        <property name="blockedId" column="blocked_id" type="int" not-null="true" length="11" />
    </class>

</hibernate-mapping>

blocked_detail_histories

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

    <class dynamic-insert="true" dynamic-update="true"
        name="nl.strohalm.cyclos.entities.groups.BlockedDetailHistories"
        table="blocked_detail_histories">
        <id name="id" type="long">
            <column name="id" sql-type="bigint" />
            <generator class="native" />
        </id>
        <many-to-one name="blockedHistories" class="nl.strohalm.cyclos.entities.groups.BlockedHistories">
            <column name="blocked_id" sql-type="integer"></column>
        </many-to-one>
        <property name="noEcash" column="no_ecash" type="string" not-null="true" length="13" />
        <property name="prevGroup" column="prev_group" type="int" not-null="true" length="11" />
        <property name="balance" column="balance" type="big_decimal" not-null="true" precision="15" scale="6" />
    </class>

</hibernate-mapping>

as you can see, the blocked_detail histories table has many-to-one relationship to blocked_histories table (in "blockedHistories" column)

i tried to run a simple mysql query to join both tables that looks like this

select bh.created_date, bdh.no_ecash, bh.type,
    bh.cif, bh.desc, bh.reason_id,
    bh.status, bh.created_by, bh.remark
from blocked_detail_histories bdh
join blocked_histories bh 
where bdh.blocked_id=4;

the mysql query above works fine, but when i tried to convert above mysql query to HQL query, the result gives me nothing.. the HQL looks like this (the ":id" here is java NamedParameters)

select bdh.blockedHistories.blockedId
from BlockedDetailHistories bdh"
join bdh.blockedHistories bh
where bh.blockedId = :id

i tried this one, but gives me nothing too

select bh.createdDate, bdh.noEcash, bh.type,
bh.cif, bh.desc, bh.reasonId,
bh.status, bh.createdBy, bh.remark
from BlockedDetailHistories bdh
join bdh.blockedHistories bh
where bh.blockedId = :id

any suggestions what i am missing here? relationship definition maybe? or anything else? any help will be appreciated :)

Not an expert in xml hibernate mapping, but have you applied fetch type for hibernate entity class, if you defined such then you can retry ur above query as follows (in case of lazy fetch type)

select bdh.blockedHistories.blockedId
from BlockedDetailHistories bdh
left join fetch bdh.blockedHistories bh
where bh.blockedId = :id

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM