私は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)
患者にはプロバイダーへの参照があり、プロパティとしてプロバイダー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という名前の患者に患者リストをフィルターすることができます。