左连接休眠“一到零或一个”制图 [英] Left join in Hibernate "one to zero or one" mapping

查看:112
本文介绍了左连接休眠“一到零或一个”制图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

 学生:oneID(主键),col1,col2,col3,subId, col4 
主题:subID(主键),col1,col2

一个或没有分配的主题。



所以在这种情况下:分配给一个主题:Student中的subId将具有映射到主题表中的子标识的某个值



在案例中:0主题分配:学生中的subId将为空。



在上面的场景中,我有一个左连接查询,如下所示:

 从学生st中选择st.col1,st.col2,su.col1,su.col2 st left join join st on stub = su .subId其中st.oneId ='abc'

如何在Hibernate中编写相同的确切查询?

  select st.col1,st.col2,su.col1,su.col2 from st st left join st.sub as su where st.oneId ='abc'

以上查询不起作用,并且出现以下错误:

 org.hibernate.hql.ast.QuerySyntaxException:加入的路径! 

我缺少什么?



我的java代码我保持两个表独立。这就是所定义的表之间没有关系。

Persistence.xml如下:

 < persistence- unit name =myEntityManagertransaction-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;

私人主题sub;

//这里的其他列
$ b public void setSub(final Subject sub){
this.sub = sub;


@OneToOne(cascade = CascadeType.ALL)
public Subject getSub(){
return this.sub;


$ / code $ / pre
$ b $主题


  @Entity 
@Table(name =SUBJECT)
public class Subject实现Serializable {

@Id
@Column(name =SUBID)
private String subId;

//这里的其他栏目
}


解决方案

正如这个hibernate论坛主题中提到的,它目前是在Hibernate中不可能在解除关联的实体上调用左连接。还有为其打开的Hibernate问题



你应该做的是定义一个一对一一对多 学生主题一对一示例多对一的例子)。



然后,假设 Student 对其主题的引用被命名为 subject



从st中选择st.col1,st.col2,su.col1,su.col2 st left join st.subjects su where st.oneId ='abc'


I have two tables as below:

Student: oneID (primary key), col1, col2, col3, subId, col4
Subject: subID (primary key), col1, col2

Every student will have exactly one or none of the subjects assigned.

So in the case: one subject assigned: subId in Student will have some value which maps to subID in Subject table

and in the case: 0 subject assigned: subId in Student will be null.

With above scenario, I have a left join query as below:

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'

How to write the same exact query in Hibernate ?

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

Above query does not work and gives the below error:

"org.hibernate.hql.ast.QuerySyntaxException: Path expected for join!"

What am I missing ?

In my java code I have kept both the tables independent. That is there is no relationship between the tables defined.

Persistence.xml is as below:

<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> 

POJOs are as below:

Student

@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;
}
} 

Subject

@Entity
@Table(name = "SUBJECT")
public class Subject implements Serializable {

@Id
@Column(name = "SUBID")
private String subId;

//other columns here
} 

解决方案

As mentioned in this hibernate forum thread, it's currently not possible in Hibernate to invoke left join on disassociated entities. There's also an opened Hibernate issue for it.

What you should do instead, is define a one-to-one or one-to-many relationship between Student and Subject (one-to-one example, many-to-one example).

Then, try this HQL, assuming the reference in Student to its subjects is named subjects:

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

这篇关于左连接休眠“一到零或一个”制图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆