web-dev-qa-db-ja.com

HQL左結合:結合に期待されるパス

私はHibernateの初心者で、HQL Left参加について質問があります。

患者とプロバイダーの2つのテーブルを結合したままにしておき、「結合に期待されるパス」を取得し続けます。 2番目のテーブルのエラー。誰かがこの問題について助けてくれれば感謝します!

2つのテーブル/クラスのマッピングは次のとおりです。

patient.hbm.xmL:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.ccg.db.test">
    <class name="patient" table="patient">
        <id name="patientId" column="patientId" type="int">
            <generator class="native"/>
        </id>
        <property name="patientName" type="string" >
           <column name="patientName" /> 
        </property>
        <property name="providerId" type="string" >
            <column name="provId" /> 
        </property>
        <many-to-one name="provider" column="providerId" class="provider" /> 
    </class>
</hibernate-mapping>

provider.hbm.xml:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.ccg.db.test">
    <class name="provider" table="provider">
        <id name="providerId" column="providerId">
            <generator class="native" />
        </id>
        <property name="providerName" column="providerName" />
    </class>
</hibernate-mapping>

ポジョ:

patient.Java

package com.ccg.db.test;

import Java.io.Serializable;
import Java.util.List;
import org.hibernate.Session;

public class patient 
implements Serializable
{
    private int patientId;
    private String patientName;
    private String providerId; // foreign key to provider

    private static final long serialVersionUID = 81073;

    public static void load(Session session, List<String> values){
        patient PatientInfo = new patient(); 

        PatientInfo.setPatientId(Integer.parseInt(values.get(0)));
        PatientInfo.setPatientName( values.get(1));
        PatientInfo.setProviderId( values.get(2) );

        session.save( PatientInfo );
    }

    /**
    * @return the PatientId
    */
    public int getPatientId() {
        return patientId;
    }

    /**
    * @param PatientId the PatientId to set
    */
    public void setPatientId(int PatientId) {
        this.patientId = PatientId;
    }

    /**
    * @return the PatientName
    */
    public String getPatientName() {
        return this.patientName;
    }

    /**
    * @param PatientName the PatientName to set
    */
    public void setPatientName(String PatientName) {
        this.patientName = PatientName;
    }

    /**
    * @return the ProvId
    */
    public String getProviderId() {
        return this.providerId;
    }

    /**
    * @param id the ProviderId to set
    */
    public void setProviderId( String id ) {
        this.providerId = id;
    }

    /**
    * @return the ProvId
    */
    public String getProvider() {
        return this.providerId;
    }

    /**
    * @param id the ProviderId to set
    */
    public void setProvider( String id ) {
        this.providerId = id;
    }  

    /**
    * @param args
    */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
    }
}

provider.Java:

package com.ccg.db.test;

import Java.io.Serializable;
import Java.util.List;

import org.hibernate.Session;

public class provider 
implements Serializable
{
    private String providerId;
    private String providerName;

    //private int patientId;
    //private int providerSpec; 

    private static final long serialVersionUID = 81073;

    public static void load(Session session, List<String> values){
        provider ProviderInfo = new provider(); 

        ProviderInfo.setProviderId( values.get(0) );
        ProviderInfo.setProviderName( values.get(1));
        //ProviderInfo.setProviderSpec( Integer.parseInt(values.get(2)) );

        session.save( ProviderInfo );
    }

    /**
    * @return the ProviderName
    */
    public String getProviderName() {
        return providerName;
    }

    /**
    * @param ProviderName the ProviderName to set
    */
    public void setProviderName(String name) {
        this.providerName = name;
    }

    /**
    * @return the ProvId
    */
    public String getProviderId() {
        return this.providerId;
    }

    /**
    * @param id the ProvId to set
    */
    public void setProviderId( String id ) {
        this.providerId = id;
    }

    /*
    public int getPatientId() {
        return this.patientId;
    }

    public void setPatientId( int id ) {
        this.patientId = id;
    }
    */

    /**
    * @param args
    */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
    }
}

左の結合クエリは次のとおりです。

select
    pat.patientId, pat.patientName
from
    patient as pat 
left join
    provider as pro 
where
    pat.providerId = pro.providerId

そしてここに結果があります:

 0:50:08,479 INFO query:156-Query = outerJoin 
 10:50:08,479 INFO query:157-select 
 pat.patientId、pat.patientName 
 from 
 patient as pat 
 left join 
 provider as pro 
 where 
 pat.providerId = pro.providerId 
 
 10:50:08,698 ERROR PARSER:33-パスは結合に必要です!
 10:50:08,698 ERROR PARSER:33-無効なパス: 'pro.providerId' 
 10:50: 08,698 ERROR PARSER:33-二項演算子の右側のオペランドがnullでした
 10:50:08,698 ERROR query:184-Problem generation query。
 org.hibernate.hql.ast.QuerySyntaxException:参加する予定のパス! [select 
 pat.patientId、pat.patientName 
 from 
 com.ccg.db.test.patient as pat 
 left join 
 provider as pro 
 where 
 pat.providerId = pro.providerId 
 
 at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.Java:31)
 at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.Java:24)
 at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.Java:59)
 at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.Java:235)
 at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.Java:160)
 org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.Java:111)
 at org.hibernate.engine.query.HQLQueryPlan。(HQLQueryPlan.Java:77)
 at org。 hibernate.engine.query.HQLQueryPlan。(HQLQueryPlan.Java:56)
 at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.Java:72)
 at org.hibernat e.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.Java:133)
 org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.Java:112)
 at org.hibernate.impl.SessionImpl。 createQuery(SessionImpl.Java:1623)
 at com.ccg.db.query.QueryManager.query(QueryManager.Java:163)
 at com.ccg.db.query.QueryManager.query( QueryManager.Java:139)
com.ccg.db.query.QueryManager.main(QueryManager.Java:80)
13
Neutron

患者にはプロバイダーへの参照があり、プロパティとしてプロバイダーIDも持っています。私はおそらく患者のプロバイダーidプロパティを取り除き、プロバイダーへの参照を取得します。次に、クエリは次のようになります。

select pat.patientId, pat.patientName 
from patient as pat 
left join pat.provider as pro

参加するには、患者からプロバイダー(この場合はpat.provider)への関連付けパスが必要です。次に、Hibernateは多対1マッピングで指定された「列」を自動的に使用して、プロバイダーテーブルに結合します。あなたの場合、プロバイダーのプロパティに対してクエリを実行していないため、結合はあまり意味がありません。

select pat 
from patient as pat 
join pat.provider as pro 
where pat.patientName = 'John' 
and pro.name = 'United Healthcare'

そこで、プロバイダーとしてUnited Healthcareを持つJohnという名前の患者に患者リストをフィルターすることができます。

26
digitaljoel