Hibernate继承与HQL

Hibernate继承与HQL,hibernate,orm,inheritance,hql,Hibernate,Orm,Inheritance,Hql,我在Hibernate中有继承,其中Connection是我的父实体,MobilePhoneConnection是扩展实体。对于继承映射,我使用了每个子类一个表的策略。这是我的档案: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.

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


我的问题是如何在MobilePhoneConnection上编写HQL查询,其中WHERE子句检查继承属性之一(contractStartDate from Connection)?我猜我需要某种连接,但不确定如何实现?我想检查MobilePhoneConnection合同的开始日期是在某个特定日期之前还是之后…

我想它就这么简单:

var query = session.CreateQuery ("from MobilePhoneConnection where contractStartDate > :p_date");
上述查询应仅返回contractStartDate大于给定日期(参数)的MobilePhoneConnection实例。
Hibernate应该足够聪明,能够理解SQL语句,以便只检索表示MobilePhoneConnections的记录。

我认为它就这么简单:

var query = session.CreateQuery ("from MobilePhoneConnection where contractStartDate > :p_date");
上述查询应仅返回contractStartDate大于给定日期(参数)的MobilePhoneConnection实例。
Hibernate应该足够聪明,能够理解SQL语句,以便只检索表示MobilePhoneConnections的记录。

这就是我实际想要的,并通过使用.class选项获得它:

from Connection c where c.contractStartDate < :afterdate and c.contractStartDate > :beforeDate and c.class = MobilePhoneConnection
来自连接c,其中c.contractStartDate<:afterdate和c.contractStartDate>:beforeDate和c.class=MobilePhoneConnection
当必须使用别名时,这可能很有用,但Frederik Gheysels的解决方案似乎也能奏效。第一次对我不起作用的是:

from MobilePhoneConnection mb where mb.contractStartDate < current_date
来自MobilePhone连接mb,其中mb.contractStartDate<当前日期
它会这样抱怨:
2010-09-22 10:56:19495 ERROR main org.hibernate.hql.PARSER-:1:72:意外的AST节点:contractStartDate这是我实际想要的,并通过使用来获得它。类选项:

from Connection c where c.contractStartDate < :afterdate and c.contractStartDate > :beforeDate and c.class = MobilePhoneConnection
来自连接c,其中c.contractStartDate<:afterdate和c.contractStartDate>:beforeDate和c.class=MobilePhoneConnection
当必须使用别名时,这可能很有用,但Frederik Gheysels的解决方案似乎也能奏效。第一次对我不起作用的是:

from MobilePhoneConnection mb where mb.contractStartDate < current_date
来自MobilePhone连接mb,其中mb.contractStartDate<当前日期
它会这样抱怨: 2010-09-22 10:56:19495错误main org.hibernate.hql.PARSER-:1:72:意外的AST节点:contractStartDate