[英]Left join in Hibernate “one to zero or one” mapping
我有两个表,如下所示:
Student: oneID (primary key), col1, col2, col3, subId, col4
Subject: subID (primary key), col1, col2
每个学生将只分配一个学科,也可以不分配任何学科。
因此,在以下情况中:分配了一个主题:Student中的subId将具有一些值,该值映射到Subject表中的subID
在以下情况下:分配了0个主题:Student中的subId将为null。
在上述情况下,我有一个左联接查询,如下所示:
select st.col1, st.col2, su.col1, su.col2 from Student st left join Subject su on st.subId = su.subId where st.oneId = 'abc'
如何在Hibernate中编写相同的查询?
select st.col1, st.col2, su.col1, su.col2 from Student st left join st.sub as su where st.oneId = 'abc'
上面的查询不起作用,并给出以下错误:
"org.hibernate.hql.ast.QuerySyntaxException: Path expected for join!"
我想念什么?
在我的Java代码中,我将两个表保持独立。 定义的表之间没有关系。
Persistence.xml如下所示:
<persistence-unit name="myEntityManager" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>com.myPackage.Student</class>
<class>com.myPackage.Subject</class>
</persistence-unit>
POJO如下:
学生
@Entity
@Table(name = "STUDENT")
public class Student implements Serializable {
@Id
@Column(name = "ONEID")
private String oneId;
private Subject sub;
//other columns here
public void setSub(final Subject sub) {
this.sub = sub;
}
@OneToOne(cascade = CascadeType.ALL)
public Subject getSub() {
return this.sub;
}
}
学科
@Entity
@Table(name = "SUBJECT")
public class Subject implements Serializable {
@Id
@Column(name = "SUBID")
private String subId;
//other columns here
}
由于我在映射中看不到模型之间的任何关联,因此可以参考此链接来解决问题。 或者只是在您的映射中添加关联,即在学生中为主题添加多对一关联并将查询修改为
select st.col1, st.col2, su.col1, su.col2 from Student st left outer join st.subject as su where st.oneId = 'abc' and st.subId = su.subId
就像在这个hibernate论坛线程中提到的那样,Hibernate当前无法在未关联的实体上调用左连接。 还存在一个未解决的Hibernate问题 。
您应该做的是在Student
和Subject
之间定义one-to-one
或one-to-many
关系( 一对一的示例 , 多对一的示例 )。
然后,尝试使用此HQL,并假设“ Student
中对其主题的引用被命名为subjects
:
select st.col1, st.col2, su.col1, su.col2 from Student st left join st.subjects su where st.oneId = 'abc'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.