В настоящее время я решаю эту проблему с помощью собственного запроса, также я знаю, что можно решить его с помощью таких запросов:
(first use cross join)
@Query("select s from SendingApplication s where s.sftpAccess.id is not null")
(second use left outer join)
@Query("select s from SendingApplication s left join s.sftpAccess sa where sa is not null")
Но это не выглядело хорошо.
У меня есть 2лица:
@Entity
@Getter
@Setter
@Table(name = "sending_application")
public class SendingApplication {
@Id
@GeneratedValue
private Integer id;
@OneToOne(mappedBy = "sendingApplication", fetch = FetchType.LAZY)
private SftpAccess sftpAccess;
}
и
@Entity
@Getter
@Setter
@Table(name = "sftp_access")
public class SftpAccess {
@Id
@GeneratedValue
private Integer id;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(
name="sending_application",
referencedColumnName = "id",
insertable = false,
updatable = false
)
private SendingApplication sendingApplication;
}
Я могу загрузить отправляющее приложение, а затем получить доступ к полю sftpAccess, и оно содержит все данные.Но у меня есть репозиторий:
@Repository
public interface SendingApplicationDao extends AbstractDao<SendingApplication> {
@Query("select s from SendingApplication s where s.sftpAccess is not null")
List<SendingApplication> loadSftpApplications();
}
и метод loadSftpApplications используют этот запрос -
SELECT
sendingapp0_.id AS id1_9_
FROM
sending_application sendingapp0_
WHERE
(sendingapp0_.id IS NOT NULL)
И я ожидаю увидеть
SELECT
sendingapp0_.id AS id1_9_
FROM
sending_application sendingapp0_
left join sftp_access on sftp_access.sending_application = sendingapp0_.id
WHERE
(sftp_access.id IS NOT NULL)
Что я делаю неправильно?
база данных:
CREATE TABLE `sending_application` (
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `sftp_access` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`sending_application` int(11) NULL ,
FOREIGN KEY (`sending_application`) REFERENCES `sending_application` (`id`),
PRIMARY KEY (id)
);