我有两张表格如下:
Student: oneID (primary key), col1, col2, col3, subId, col4
Subject: subID (primary key), col1, col2
每个学生都会分配一个或哪个科目。
所以在这种情况下:分配了一个主题:Student中的subId将有一些值映射到Subject表中的subID
,在这种情况下:0主题分配:学生中的subId将为空。
在上面的场景中,我有一个左连接查询,如下所示:
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
}
答案 0 :(得分:0)
由于我没有在映射中看到您的模型之间存在任何关联,因此可以参考this链接查找您的问题。或者只是在您的映射中添加关联,即在学生中为主题添加多对一关联并将您的查询修改为
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
答案 1 :(得分:0)
正如this hibernate forum thread中所提到的,Hibernate目前无法在解除关联的实体上调用左连接。它还有一个opened Hibernate issue。
您应该做的是在one-to-one
和one-to-many
(one-to-one example,many-to-one example)之间定义Student
或Subject
关系。
然后,尝试这个HQL,假设Student
中对其主题的引用被命名为subjects
:
select st.col1, st.col2, su.col1, su.col2 from Student st left join st.subjects su where st.oneId = 'abc'