Я столкнулся с одной проблемой в своем проекте, поэтому приведу пример использования демо-проекта. Представьте, что есть две сущности: учитель и ученик.
@Entity
@Table(name = "STUDENTS")
public class Student {
@Id
@GeneratedValue
private Long id;
private String name;
private String surname;
@ManyToOne
private Teacher teacher;
// getters and setters
}
@Entity
@Table(name = "TEACHERS")
public class Teacher {
@Id
@GeneratedValue
private Long id;
private String name;
private String surname;
@OneToMany(mappedBy = "teacher")
List<Student> students = new ArrayList<>();
// getters and setters
}
Есть хранилище и класс обслуживания:
public interface TeacherRepository extends PagingAndSortingRepository<Teacher, Long>, JpaSpecificationExecutor<Teacher> {
}
@Service
public class TeacherService {
@Autowired
private TeacherRepository teacherRepository;
@Autowired
private TeacherToDTOMapper teacherToDTOMapper;
public Page<TeacherDTO> findAll(Pageable pageable) {
Specification<Teacher> specification = (root, criteriaQuery, criteriaBuilder) -> {
return criteriaBuilder.lessThanOrEqualTo(root.get("id"), 2);
};
return teacherRepository.findAll(specification, pageable).map(teacherToDTOMapper::mapEntityToDTO);
}
}
И, наконец, класс контроллера :
@RestController
public class TeacherController {
@Autowired
private TeacherService teacherService;
@GetMapping("/teachers")
@ResponseStatus(HttpStatus.OK)
public PagedModel<EntityModel<TeacherDTO>> findAll(PagedResourcesAssembler<TeacherDTO> resourcesAssembler, Pageable pageable) {
Page<TeacherDTO> page = teacherService.findAll(pageable);
return resourcesAssembler.toModel(page);
}
}
В пользовательском интерфейсе имеется таблица учителей .
Пользователь отфильтровывает учителей с идентификатором> 2 и сортирует их по именам своих учеников. Ожидаемый результат должен содержать Aliyah Wiggins и Macy Reyes именно в этом порядке (потому что ученица Амина Паркс должна быть первой после сортировки). http://localhost: 8080 / учителя? Страница = 0 & размер = 3 & сортировка = Students.name, как c
Однако фактический результат:
{
"_embedded": {
"teacherDTOList": [
{
"id": 1,
"name": "Aliyah",
"surname": "Wiggins",
"students": [
{
"id": 1,
"name": "Amina",
"surname": "Parks"
},
{
"id": 2,
"name": "Caleb",
"surname": "Baker"
},
{
"id": 3,
"name": "Valentino",
"surname": "Kent"
},
{
"id": 4,
"name": "Jaron",
"surname": "Luna"
},
{
"id": 5,
"name": "Cayden",
"surname": "Hoover"
}
]
},
{
"id": 1,
"name": "Aliyah",
"surname": "Wiggins",
"students": [
{
"id": 1,
"name": "Amina",
"surname": "Parks"
},
{
"id": 2,
"name": "Caleb",
"surname": "Baker"
},
{
"id": 3,
"name": "Valentino",
"surname": "Kent"
},
{
"id": 4,
"name": "Jaron",
"surname": "Luna"
},
{
"id": 5,
"name": "Cayden",
"surname": "Hoover"
}
]
},
{
"id": 2,
"name": "Macy",
"surname": "Reyes",
"students": [
{
"id": 6,
"name": "Jasmin",
"surname": "Friedman"
},
{
"id": 7,
"name": "Randall",
"surname": "Archer"
},
{
"id": 8,
"name": "Caroline",
"surname": "Davila"
},
{
"id": 9,
"name": "Sarah",
"surname": "Pace"
}
]
}
]
},
"_links": {
"self": {
"href": "http://localhost:8080/teachers?page=0&size=3&sort=students.name,asc"
}
},
"page": {
"size": 3,
"totalElements": 3,
"totalPages": 1,
"number": 0
}
}
Там являются дубликатами записей для Алии Виггинс. Я не нашел подходящего способа получения ожидаемого результата, поэтому сейчас я думаю, что поиск объектов, связанных с одним объектом, с сортировкой по свойству в другом объекте не является правильным. Демо-проект доступен здесь .