左连接Hibernate“一对零或一”映射

时间:2012-01-09 06:44:22

标签: java sql hibernate

我有两张表格如下:

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
} 

2 个答案:

答案 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-oneone-to-manyone-to-one examplemany-to-one example)之间定义StudentSubject关系。

然后,尝试这个HQL,假设Student中对其主题的引用被命名为subjects

select st.col1, st.col2, su.col1, su.col2 from Student st left join st.subjects su where st.oneId = 'abc'