Hibernate наследование и HQL - PullRequest
       19

Hibernate наследование и HQL

1 голос
/ 22 сентября 2010

У меня есть наследование в Hibernate, где Connection является моей родительской сущностью, а MobilePhoneConnection является расширенной сущностью. Я использовал одну таблицу для каждой стратегии подкласса для отображения наследования. Это мой файл:

<?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 schema="billing_cms" default-lazy="false" default-cascade="all">
    <class name="edu.etf.fuzzy.billingcms.domain.model.Connection"
        table="base_connection">
        <id name="ID" type="integer" column="id" access="field">
            <generator class="increment" />
        </id>
        <property name="contractStartDate" type="date" column="contract_start_date"
            not-null="true" />
        <property name="contractEndDate" type="date" column="contract_end_date" />
        <property name="contractNumber" type="string" column="contract_number" not-null="true" unique="true"/>
        <property name="description" type="string" column="description" />
        <property name="creationDate" not-null="true" type="date"
            column="date_created" />
        <property name="createdBy" type="string" column="created_by" />
        <property name="lastUpdatedBy" type="string" column="last_updated_by" />
        <property name="lastUpdateDate" type="date" column="last_modification_date" />
        <property name="isDeleted" not-null="true" type="boolean"
            column="deleted_indicator" />
        <property name="isFunctioning" type="boolean"
            column="functioning_indicator" />
        <property name="assignedUser" type="string" column="assigned_user" />

        <many-to-one name="administrativeCenter"
                     class="edu.etf.fuzzy.billingcms.domain.model.AdministrativeCenter"
                     column="administrative_center_id"/>

        <list name="bills" cascade="all">
            <key column="connection_id" />
            <index column="idx"></index>
            <one-to-many class="edu.etf.fuzzy.billingcms.domain.model.Bill" />
        </list>

        <joined-subclass name="edu.etf.fuzzy.billingcms.domain.model.MobilePhoneConnection"
                         table="mobile_phone_connection">
            <key column="id"/>
            <property name="operator" type="string" column="operator" not-null="true"/>
            <property name="userCode" type="string" column="user_code"/>
            <property name="packetName" type="string" column="packet_name" not-null="true"/>
            <property name="monthExpenseLimit" type="integer" column="month_expense_limit" not-null="true"/>
            <property name="isPrepaid" type="boolean" column="is_prepaid" not-null="true"/>
            <property name="lineNumber" type="string" column="line_number" not-null="true"/>
            <property name="hasGPRS" type="boolean" column="gprs"/>
            <property name="hasUMTS" type="boolean" column="umts"/>
            <property name="hasEDGE" type="boolean" column="edge"/>
        </joined-subclass>
        <joined-subclass name="edu.etf.fuzzy.billingcms.domain.model.PSTNConnection"
                         table="pstn_connection">
            <key column="id"/>
            <property name="operator" type="string" column="operator" not-null="true"/>
            <property name="userCode" type="string" column="user_code"/>
            <property name="lineNumber" type="string" column="line_number" not-null="true"/>
            <property name="monthExpenseLimit" type="integer" column="month_expense_limit"/>
            <property name="isLocalLoop" type="boolean" column="is_local_loop" not-null="true"/>
        </joined-subclass>
        <joined-subclass name="edu.etf.fuzzy.billingcms.domain.model.InternetConnection"
                         table="internet_connection">
            <key column="id"/>
            <property name="provider" type="string" column="provider" not-null="true"/>
            <property name="userCode" type="string" column="user_code"/>
            <property name="packetName" type="string" column="packet_name" not-null="true"/>
            <property name="linkThroughput" type="string" column="link_throughput" not-null="true"/>
            <property name="downloadCapacity" type="string" column="download_capacity" not-null="true"/>
            <property name="uploadCapacity" type="string" column="upload_capacity" not-null="true"/>
        </joined-subclass>
        <joined-subclass name="edu.etf.fuzzy.billingcms.domain.model.OuterConnection"
                         table="outer_connection">
            <key column="id"/>
            <property name="fromLocation" type="string" column="from_location" not-null="true"/>
            <property name="toLocation" type="string" column="to_location" not-null="true"/>
            <property name="userCode" type="string" column="user_code"/>
            <property name="lineNumber" type="string" column="line_number"/>
            <property name="monthExpenseLimit" type="integer" column="month_expense_limit" not-null="true"/>
            <property name="capacity" type="string" column="capacity"/>
        </joined-subclass>
    </class>

    <query name="getMobileConnectionByLineNumber">
        <![CDATA[from MobilePhoneConnection mb where mb.lineNumber = :lineNumber]]>
    </query>

</hibernate-mapping>

Мой вопрос: как мне написать HQL-запрос на MobilePhoneConnection с предложением WHERE, проверяющим одно из унаследованных свойств (contractStartDate from Connection)? Я предполагаю, что мне нужны какие-то соединения, но не знаете, как этого добиться? Я хочу проверить погоду Дата начала контракта MobilePhoneConnection до или после определенной даты ...

Ответы [ 2 ]

1 голос
/ 22 сентября 2010

Я думаю, это так же просто, как это:

var query = session.CreateQuery ("from MobilePhoneConnection where contractStartDate > :p_date");

Приведенный выше запрос должен возвращать только экземпляры MobilePhoneConnection, для которого contractStartDate превышает заданную дату (параметр). Hibernate должен быть достаточно умным, чтобы вычислить оператор SQL, чтобы можно было извлечь только записи, представляющие MobilePhoneConnections.

0 голосов
/ 22 сентября 2010

Это то, что я на самом деле хотел и смог получить, используя опцию .class:

from Connection c where c.contractStartDate < :afterdate and c.contractStartDate > :beforeDate and c.class = MobilePhoneConnection

Это может быть полезно, когда нужно использовать псевдонимы, но похоже, что решение от Фредерика Гейсела также работает. То, что не сработало для меня в первый раз, это:

from MobilePhoneConnection mb where mb.contractStartDate < current_date

Было бы жаловаться так: 2010-09-22 10: 56: 19,495 ОШИБКА main org.hibernate.hql.PARSER -: 1: 72: неожиданный узел AST: contractStartDate

...