【发布时间】:2020-02-22 13:28:37
【问题描述】:
我在我的项目中遇到了一个问题,因此我将提供一个使用演示项目的示例。假设有两个实体:教师和学生。
@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);
}
}
在 UI 上有一个table of teachers。
用户过滤掉 id > 2 的教师,并按学生姓名对他们进行排序。预期的结果应该完全按照该顺序包含 Aliyah Wiggins 和 Macy Reyes(因为学生 Amina Parks 应该是排序后的第一个)。 http://localhost:8080/teachers?page=0&size=3&sort=students.name,asc
但是,实际结果是:
{
"_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
}
}
Aliyah Wiggins 有重复记录。我还没有找到一种适当的方法来获得预期的结果,所以现在我认为搜索与一个实体相关的对象并在另一个实体中按属性排序是不正确的。 演示项目可用here。
【问题讨论】:
标签: java sql spring spring-boot spring-data-jpa