2010-09-22 6 views
1

je héritage Hibernate pour savoir où la connexion est mon entité mère et MobilePhoneConnection est l'entité élargie. J'ai utilisé une table par stratégie de sous-classe pour le mappage d'héritage. Ceci est mon fichier:héritage Hibernate et 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> 

Ma question est de savoir comment puis-je écrire sur requête HQL MobilePhoneConnection avec clause WHERE cochant l'une des propriétés héritées (contractStartDate de connexion)? Je suppose que j'ai besoin d'une sorte de jointure, mais je ne sais pas comment y parvenir? Je veux vérifier la date de début du contrat météo MobilePhoneConnection est avant ou après une date précise ...

Répondre

1

Je pense qu'il est tout aussi simple que cela:

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

La requête ci-dessus doit seulement retourner les instances de MobilePhoneConnection dont contractStartDate est supérieur à la date donnée (paramètre). Hibernate devrait être assez intelligent pour comprendre l'instruction SQL afin que seuls les enregistrements représentant MobilePhoneConnections soient récupérés.

0

Voilà ce que je voulais réellement et a réussi à l'obtenir en utilisant l'option .class:

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

Cela peut être utile quand on utiliser les alias, mais semble comme solution de Frederik Gheysels fonctionne également. Ce qui n'a pas pour moi première fois est la suivante:

from MobilePhoneConnection mb where mb.contractStartDate < current_date 

Il se plaignait comme ceci: 2010-09-22 10: 56: 19495 erreur principale org.hibernate.hql.PARSER -: 1: 72: noeud AST inattendu: contractStartDate

Questions connexes