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作为提供者。
- 具有主键的Hibernate类也是外键
- ClassNotFoundException:org.hibernate.service.jndi.JndiException
- NoClassDefFoundError:javax / validation /validation甚至在POM中validation-api 1.1.0.Final
- 如何使用带有Oracle 10g方言的Hibernate使用JPA生成我的id?
- 在Hibernate 3.2中使用连接池(c3p0-0.9.1.2)时,获取exception和应用程序无法与MySqL数据库连接?
- 这些实体的equals和hashCode(Spring MVC + Hibernate)
- EntityManager persist()不保存任何数据库
- 解释使用Hibernate映射自动递增的复合id序列的行为
- 如何在hibernate中使用一对一映射执行插入