Spring-Data @Query с JOIN FETCH, возвращает декартову - PullRequest
1 голос
/ 14 октября 2019

У меня есть декартово, когда я запускаю @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"]
}
]
...