2010-09-22 101 views
1

我在Hibernate中繼承其中Connection是我的父實體,而MobilePhoneConnection是擴展實體。我爲每個子類策略使用了一張表來進行繼承映射。這是我的文件:Hibernate繼承和HQL

<?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從連接)?我猜我需要某種連接,但不知道如何完成這一點?我要檢查的天氣MobilePhoneConnection合同開始日期之前或某些特定日期後...

回答

1

我覺得這只是這樣簡單:

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

上面的查詢應該只返回MobilePhoneConnection情況下,其contractStartDate大於給定日期(參數)。 Hibernate應該足夠聰明以找出SQL語句,以便僅檢索代表MobilePhoneConnection的記錄。

0

這就是我其實是想和管理使用的.class選項來獲得它:

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

這可能是有用的,當一個不得不使用別名,但好像從弗雷德裏克Gheysels解決方案也適用。什麼也沒有爲我工作第一次是這樣的:

from MobilePhoneConnection mb where mb.contractStartDate < current_date 

它會抱怨這樣的: 2010-09-22 10:56:19,495 ERROR主要org.hibernate.hql.PARSER - :1:72:意外的AST節點:contractStartDate