views:

73

answers:

2

Hello Hibernate daemons,

I have inheritance in Hibernate for where Connection is my parent entity, and MobilePhoneConnection is extended entity. I used one table per subclass strategy for inheritance mapping. This is my file:

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

My question is how do I write HQL query on MobilePhoneConnection with WHERE clause checking one of inherited properties (contractStartDate from Connection)? I am guessing I need some sort of joins but not sure how to accomplish this? I want to check weather MobilePhoneConnection contract start date is before or after some specific date...

A: 

I think it is just as simple as this:

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

The above query should only return MobilePhoneConnection instances whose contractStartDate is greater then the given date (parameter). Hibernate should be smart enough to figure out the SQL statement so that only the records that represent MobilePhoneConnections are retrieved.

Frederik Gheysels
A: 

This is what I actually wanted and managed to get it by using .class option:

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

This might be usefull when one have to use aliases, but seems like solution from Frederik Gheysels also works. What did not work for me first time is this:

from MobilePhoneConnection mb where mb.contractStartDate < current_date

It would complain like this: 2010-09-22 10:56:19,495 ERROR main org.hibernate.hql.PARSER - :1:72: unexpected AST node: contractStartDate

ZeKoU