У меня есть две сущности:
@Entity
@Table(name = "Something")
public class SomethingEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SOMETHING_SEQ")
@SequenceGenerator(sequenceName = "SOMETHING_SEQ", allocationSize = 1, name = "SOMETHING_SEQ")
@Column(name = "SOMETHING_ID", precision = 18, scale = 0, nullable = false)
private Long somethingId;
@Column(name = "SIMPLE_FIELD", length = 3, nullable = true)
private String simpleField;
@OneToOne(cascade = CascadeType.ALL, mappedBy = "somethingId")
private OtherEntity other;
}
@Entity
@Table(name = "OTHER")
public class OtherEntity implements Serializable {
@Id
@OneToOne
@JoinColumn(name = "SOMETHING_ID")
private SomethingEntity somethingId;
@Column(name = "OTHER_SIMPLE_FIELD", precision = 18, scale = 2, nullable = false)
private Double otherSimpleField;
}
Я хочу, чтобы Spring-Data с нетерпением получал otherEntity
. Я знаю, что он не работает по умолчанию, поэтому мой метод хранилища:
@EntityGraph(attributePaths = {"other"})
List<SomethingEntity> findAll(Predicate predicate);
Это не работает, и я думаю, это из-за @OneToOne
. Я также попробовал JOIN FETCH, просто выберите simpleField
(предикат в моем примере - QueryDSL), ничего не работает.
Самое удивительное, что начальный SQL на самом деле правильный - он содержит правильные объединения и выбирает правильные поля. Затем Spring-Data в любом случае загружает каждое отношение @OneToOne
по id, вызывая 100 запросов вместо 1.