По моему мнению, JavaDoc для org.springframework.data.repository.Repository
является неточным в отношении общего параметра <T>
. Он говорит:
@param тип домена, которым управляет репозиторий
Хорошо.
Предположим, у нас есть эти сущности:
@Entity
@Table
public class Parent {
@Id
private Long id;
@Getter
@OrderBy
@OneToMany(mappedBy = "parent")
private Set<Children> children;
}
@Entity
@Table
public class Children {
@Id
private Long id;
@OneToOne
@JoinColumn(name = "parent_id", nullable = false)
private Parent parent;
}
Если запрашиваются все дочерние элементы одного из родителей, какой репозиторий является правильным?
public interface ParentRepository extends Repository<Parent, Long> {
// IntelliJ Warning: 'Children' domain type or valid projection interface expected here
@Query("SELECT children FROM Parent WHERE id = ?1")
List<Children> getChildrenByParentId(Long parentId);
}
public interface ChildrenRepository extends Repository<Children, Long> {
@Query("SELECT children FROM Parent WHERE id = ?1")
List<Children> getChildrenByParentId(Long parentId);
}
А как насчет этого дополнительного запроса?
@Query("SELECT parent.children FROM Parent parent LEFT JOIN parent.children children WHERE parent.id = ?1 ORDER BY children.id")
List<Children> getOrderedChildrenByParentId(Long parentId);
Поскольку он работает независимо от того, какой репозиторий используется, меня больше интересует, почему именно ParentRepository
или ChildrenRepository
.
После беглого просмотра документации: https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#reference, ParentRepository
кажется более правильным, хотя предупреждение IntelliJ.