У меня есть декартово, когда я запускаю @Query с JOIN FETCH
У меня есть две простые сущности: родительская и дочерняя, соединяющая поле 'parent_id'. Родитель имеет поле @ElementCollection, которое должно содержать имена всех детей (см. Код). Хранилище SpringData содержит простой метод findAll с @Query, который я пытаюсь собрать вместе с родителями с ребенком. Когда я использую простой метод findAll (), он возвращает ожидаемое количество Parents, каждый из которых содержит коллекцию child_names, как и ожидалось. Но он производит SQL-запрос от каждого родителя. Когда я пытаюсь оптимизировать SQL-запросы, я добавляю @Query с предикатом «JOIN FETCH», он производит только один запрос, как ожидалось, НО вместо одного родителя он возвращает родителя для каждой дочерней записи. Не могли бы вы дать мне представление о том, что не так с моим @Query, почему он возвращает декартову, а не просто объединяет две записи и возвращает только одного родителя?
@Entity
@Table(name = "PARENT")
public class Parent {
@Id @Column(name = "parent_id") private String parentId;
@Column(name = "parent_name") private String parentName;
@ElementCollection (fetch = FetchType.LAZY)
@CollectionTable(name = "CHILD",
joinColumns = @JoinColumn(name = "parent_id", referencedColumnName = "parent_id")
)
@Column(name = "child_name")
private List<String> childNames;
@Entity
@Table(name = "CHILD")
public class Child {
@EmbeddedId private ChildKey key;
@Column(name = "child_name") private String childName;
... getters-setters are omitted ...
}
@Repository
public interface ParentRepo extends JpaRepository<Parent, String> {
@Query("from Parent s JOIN FETCH s.childNames names")
List<Parent> findAll();
}
@RestController
@RequestMapping("/api")
public class MyController {
@Autowired private ParentRepo repo;
@GetMapping("/findAll")
List<Parent> findAll() {
return repo.findAll();
}
}
Iожидайте вывода при настройке репозитория JPA с @Query с JOIN FETCH:
[ {
"parentId": "000001",
"parentName": "parent1",
"childNames": ["child1.1","child1.2","child1.3"]
} ]
Но фактический результат:
[ {
"parentId": "000001",
"parentName": "parent1",
"childNames": ["child1.1","child1.2","child1.3"]
},
{
"parentId": "000001",
"parentName": "parent1",
"childNames": ["child1.1","child1.2","child1.3"]
},
{
"parentId": "000001",
"parentName": "parent1",
"childNames": ["child1.1","child1.2","child1.3"]
}
]