Spring-Data @Query с JOIN FETCH, возвращает декартову системуJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Spring-Data @Query с JOIN FETCH, возвращает декартову систему

Сообщение Anonymous »

У меня есть декартово при запуске @Query с JOIN FETCH

У меня есть две простые сущности: родительский и дочерний элементы, соединяющиеся по полю «parent_id».
Родитель имеет поле @ElementCollection, которое должно содержать имена всех дочерних элементов (см. код).
Репозиторий SpringData содержит просто простой метод findAll с @Query, который я пытаюсь получить вместе с родителями и дочерними элементами.
/>Когда я использую простой метод findAll(), он возвращает ожидаемое количество родителей, каждый из которых содержит коллекцию дочерних_имен, как и ожидалось. Но он создает 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 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
{

@Query("from Parent s JOIN FETCH s.childNames names")
List findAll();
}


@RestController
@RequestMapping("/api")
public class MyController {

@Autowired private ParentRepo repo;

@GetMapping("/findAll")
List findAll() {
return repo.findAll();
}
}


Я ожидаю вывода при настройке репозитория 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"]
}
]


Подробнее здесь: https://stackoverflow.com/questions/583 ... -cartesian
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»