2009-08-11 5 views
13

Ich bin neu bei Hibernate, und ich habe eine Frage bezüglich HQL Left Join.HQL linken Join: Pfad für Join

Ich versuche, zwei Tabellen, Patient und Anbieter zu verbinden, und immer "Pfad für Join zu erwarten!" Fehler in der zweiten Tabelle. Schätze es, wenn jemand zu diesem Thema beitragen kann! Hier

ist die Abbildung der 2 Tabellen/Klassen:

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> 

pojo:

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

Hier ist die linke Join-Abfrage:

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

und hier ist das Ergebnis:

 
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 - Path expected for join! 
10:50:08,698 ERROR PARSER:33 - Invalid path: 'pro.providerId' 
10:50:08,698 ERROR PARSER:33 - right-hand operand of a binary operator was null 
10:50:08,698 ERROR query:184 - Problem generating query. 
org.hibernate.hql.ast.QuerySyntaxException: Path expected for join! [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) 
at 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.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133) 
at 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) 
at com.ccg.db.query.QueryManager.main(QueryManager.java:80) 
+9

Wenn Sie Hilfe benötigen, müssen Sie mehr Respekt für die Zeit derer zeigen, die Ihnen helfen, und formatieren Sie Ihren Code zu etwas lesbarem. Ich gebe dir eins umsonst - die Frage sollte jetzt fast lesbar sein. –

Antwort

26

Ihr Patient einen Verweis auf den Anbieter hat, und auch hat die Provider-ID als Eigenschaft. Ich würde wahrscheinlich die Provider-ID-Eigenschaft auf den Patienten loswerden und nur den Verweis auf den Anbieter haben. Dann sollte Ihre Abfrage in etwa so sein.

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

beizutreten, müssen Sie den Verband Weg von Ihrem Patienten zu Ihrem Provider, die in diesem Fall pat.provider ist. Dann verwendet der Ruhezustand automatisch die "Spalte", die in der Viele-zu-Eins-Zuordnung angegeben ist, um der Provider-Tabelle beizutreten. In Ihrem Fall die Verbindung nicht viel Sinn machen, da Sie alle Eigenschaften des Anbieters nicht Abfrage auf sind, so etwas wie dies vielleicht mehr Sinn

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

Es Sie Ihren Patienten zu filtern sind in der Lage zu machen Liste an Patienten namens John, die United Healthcare als Anbieter haben.