HQL左连接:加入的路径

我是Hibernate的新手,我有一个关于HQL左连接的问题。

我尝试离开加入2个表,患者和提供者,并继续获得“期望加入的路径!” 第二个表上的错误。 如果有人可以帮助解决这个问题,请欣赏它!

这是2个表/类的映射:

patient.hbm.xmL:

                

provider.hbm.xml:

           

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 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 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查询:156  -  Query = outerJoin
 10:50:08,479 INFO查询:157  - 选择
 pat.patientId,pat.patientName
从
耐心等待 
离开加入
提供者作为亲 
哪里
 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  - 二元运算符的右侧操作数为空
 10:50:08,698错误查询:184  - 生成查询的问题。
 org.hibernate.hql.ast.QuerySyntaxException:加入的路径!  [选择
 pat.patientId,pat.patientName
从
 com.ccg.db.test.patient作为pat 
离开加入
提供者作为亲 
哪里
 pat.providerId = pro.providerId
 ]
在org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:31)
在org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:24)
在org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:59)
在org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:235)
在org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:160)
在org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111)
在org.hibernate.engine.query.HQLQueryPlan。(HQLQueryPlan.java:77)
在org.hibernate.engine.query.HQLQueryPlan。(HQLQueryPlan.java:56)
在org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
在org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
在org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
在org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1623)
在com.ccg.db.query.QueryManager.query(QueryManager.java:163)
在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将自动使用多对一映射中指定的“列”加入提供程序表。 在你的情况下,连接没有多大意义,因为你没有查询提供者的任何属性,所以这样的事情可能更有意义

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

在那里,您可以将患者名单过滤给名为John的患者,他们将United Healthcare作为提供者。