преобразование SQL-запроса внешнего соединения в EJB-компоненты управления данными
Вопрос
Я новичок в EJB и пытаюсь разобраться в переводе концепций SQL в EJB-компоненты управления данными.
Предположим, у меня есть две таблицы:ЛЮДИ (идентификатор, имя), КОНТАКТ (pid, номер_телефона).Если я хочу получить список всех людей, независимо от того, есть ли у них номера телефонов, в моем сеансовом компоненте EJB я просто отправляю SQL-запрос через JDBC, например:
SELECT PEOPLE.name, CONTACT.phone_number
FROM PEOPLE
LEFT JOIN CONTACT ON PEOPLE.id = CONTACT.pid
Вместо использования SQL/JDBC теперь я хочу использовать EJB-компоненты управления данными.Поэтому я создаю соответствующие классы EJB3-компонентов для своих таблиц.
Таким образом, теперь у меня есть доступ к обоим классам сущностей из моего сеансового компонента, и я больше не хочу получать доступ к таблицам моей базы данных напрямую через SQL/JDBC из моего сеансового компонента.Я хочу использовать только свои объектные компоненты и возможности JPA.Какова правильная конструкция EJB, чтобы в моем сеансовом компоненте я получал те же результаты, что и мой запрос SQL?
Мне неясно, как использовать классы EJB-компонентов для получения тех же результатов, что и мой запрос внешнего соединения SQL.Помощь.
Решение
Сначала создайте два объекта JPA, что-то вроде этого для People
:
@Entity
@Table( name="PEOPLE" )
public class People {
@Id @Column
private Long id;
@Column
private String name;
@OneToOne
@JoinColumn( name="pid" )
private Contact contact;
// getters and setters
}
И для Contact
:
@Entity
@Table( name="CONTACT" )
public class Contact {
@Id @Column
private Long pid;
@Column
private String phoneNumber;
// getters and setters
}
Затем, чтобы сгенерировать запрос OUTER JOIN с использованием JPQL:
SELECT p FROM People p LEFT JOIN p.contact c