【发布时间】:2012-01-09 06:44:22
【问题描述】:
我有两张表如下:
Student: oneID (primary key), col1, col2, col3, subId, col4
Subject: subID (primary key), col1, col2
每个学生都会有一个或没有指定的科目。
所以在这种情况下:分配的一个主题:学生中的 subId 将具有映射到主题表中的 subID 的一些值
在这种情况下:分配了 0 个主题:Student 中的 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
}
【问题讨论】:
-
我的疑问是,虽然主题不适用于给定的学生,但您正在投影主题属性......我认为这可能会导致 NullPointerException!
-
你需要学生和学科之间的关系才能使用加入,而且学生看起来不像有“subId”
-
@bestsss:我在学生表 subId 中只有一个属性。当它不为空时,我们可以将它与主题表连接以获取主题详细信息。
-
你的意思是每个学生只有一门学科吗?在任何情况下,您都需要
Student或Collection<Subject>中的Subject字段,具体取决于关系。 -
关注@yair 的回答并阅读一些教程,查看示例。