У меня есть декартово при запуске @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
Spring-Data @Query с JOIN FETCH, возвращает декартову систему ⇐ JAVA
Программисты JAVA общаются здесь
-
Anonymous
1770199722
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"]
}
]
Подробнее здесь: [url]https://stackoverflow.com/questions/58374450/spring-data-query-with-join-fetch-returns-cartesian[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия