Левое соединение в отображении Hibernate "один к нулю или один" - PullRequest
0 голосов
/ 09 января 2012

У меня есть две таблицы, как показано ниже:

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

Каждому студенту будет назначен ровно один или ни один из предметов.

Таким образом, в случае: один назначенный субъект: subId в Student будет иметь некоторое значение, которое соответствует subID в таблице тем

, а в случае: 0 назначенный субъект: subId в Student будет нулевым.

В приведенном выше сценарии у меня есть запрос левого соединения, как показано ниже:

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 указаны ниже:

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
} 

Ответы [ 2 ]

0 голосов
/ 09 января 2012

Как упомянуто в этой ветке форума hibernate , в настоящее время в Hibernate невозможно вызвать левое соединение для диссоциированных объектов. Для него также есть открытый выпуск Hibernate .

Вместо этого вы должны определить one-to-one или one-to-many отношение между 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'

0 голосов
/ 09 января 2012

Поскольку я не вижу никакой связи между вашими моделями в отображении, вы можете обратиться к этой ссылке для вашей проблемы.Или просто добавьте ассоциацию в ваше отображение, то есть в студенте добавьте ассоциацию «многие к одному» для предмета и измените свой запрос как

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...