Spring 数据 mongoDB : 使用 Example Executor 和 Pageable 按子对象 ID 查找所有
Spring data mongoDB : Find all by child object id with Example Executor and Pageable
我在通过子对象 ID、示例和可分页查找全部来查询存储库时遇到问题。
StudentController.java
@RestController
@RequestMapping("/students")
public class StudentController {
@Autowired
private StudentService studentService;
@RequestMapping(method = RequestMethod.GET)
public Page<Student> getStudentsPage(
@PageableDefault(page = 0, size = 10) @SortDefault.SortDefaults({
@SortDefault(sort = "id", direction = Direction.DESC) }) Pageable pageable,
Student student) {
return studentService.getStudentPage(student, pageable);
}
}
StudentService.java
@Service
public class StudentService {
private static final Logger logger = LoggerFactory.getLogger(StudentService.class);
@Autowired
private UserService userService;
@Autowired
private StudentRepository studentRepository;
public Page<Student> getStudentsPage(Student student, Pageable pageable) {
logger.debug("Getting Students : {}, {}", student, pageable);
//gets organization Id of the student from the session
String organizationId = userService.getUserMe().getOrganization().getId();
Page<Student> studentPage = studentRepository.findAllByOrganizationId(organizationId, Example.of(student), pageable);
logger.debug("Students: {}", studentPage.getContent());
return studentPage;
}
}
StudentRepository.java
@Repository
public interface StudentRepository extends MongoRepository<Student, String> {
Page<Student> findAllByOrganizationId(String organizationId, Example<Student> example, Pageable pageable);
}
Student.java
@Document(collection = "students")
public class Student {
@Id
private String id;
private String firstName;
private String lastName;
@DBRef(db = "organizations")
private Organization organization;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Organization getOrganization() {
return organization;
}
public void setOrganization(Organization organization) {
this.organization = organization;
}
@Override
public String toString() {
return "Student [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", organization="
+ organization + "]";
}
}
Organization.java
@Document(collection = "organizations")
public class Organization {
@Id
private String id;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Organization [id=" + id + ", name=" + name + "]";
}
}
GET API 请求:
http://localhost:8080/students?page=0&size=10&sort=id,desc&lastName=xyz
存储库方法
Page findAllByOrganizationId(String organizationId, Example example, Pageable pageable);
应该 return 具有匹配的 organizationId 和 lastName=xyz 的所有记录,但它 return 是与组织 ID 匹配的记录以及所有学生,而不考虑 lastName。
代码有问题吗?
终于找到答案了。
findBy 和 Example Executor 不能一起工作。
通过示例执行器设置子对象过滤器和查询,如下所示。
public Page<Student> getStudentsPage(Student student, Pageable pageable) {
logger.debug("Getting Students : {}, {}", student, pageable);
//gets organization Id of the student from the session
String organizationId = userService.getUserMe().getOrganization().getId();
student.setOrganization(new Organization(organizationId));
Page<Student> studentPage = studentRepository.findAll(Example.of(student), pageable);
logger.debug("Students: {}", studentPage.getContent());
return studentPage;
}
这符合预期!!
谢谢!!
我在通过子对象 ID、示例和可分页查找全部来查询存储库时遇到问题。
StudentController.java
@RestController
@RequestMapping("/students")
public class StudentController {
@Autowired
private StudentService studentService;
@RequestMapping(method = RequestMethod.GET)
public Page<Student> getStudentsPage(
@PageableDefault(page = 0, size = 10) @SortDefault.SortDefaults({
@SortDefault(sort = "id", direction = Direction.DESC) }) Pageable pageable,
Student student) {
return studentService.getStudentPage(student, pageable);
}
}
StudentService.java
@Service
public class StudentService {
private static final Logger logger = LoggerFactory.getLogger(StudentService.class);
@Autowired
private UserService userService;
@Autowired
private StudentRepository studentRepository;
public Page<Student> getStudentsPage(Student student, Pageable pageable) {
logger.debug("Getting Students : {}, {}", student, pageable);
//gets organization Id of the student from the session
String organizationId = userService.getUserMe().getOrganization().getId();
Page<Student> studentPage = studentRepository.findAllByOrganizationId(organizationId, Example.of(student), pageable);
logger.debug("Students: {}", studentPage.getContent());
return studentPage;
}
}
StudentRepository.java
@Repository
public interface StudentRepository extends MongoRepository<Student, String> {
Page<Student> findAllByOrganizationId(String organizationId, Example<Student> example, Pageable pageable);
}
Student.java
@Document(collection = "students")
public class Student {
@Id
private String id;
private String firstName;
private String lastName;
@DBRef(db = "organizations")
private Organization organization;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Organization getOrganization() {
return organization;
}
public void setOrganization(Organization organization) {
this.organization = organization;
}
@Override
public String toString() {
return "Student [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", organization="
+ organization + "]";
}
}
Organization.java
@Document(collection = "organizations")
public class Organization {
@Id
private String id;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Organization [id=" + id + ", name=" + name + "]";
}
}
GET API 请求: http://localhost:8080/students?page=0&size=10&sort=id,desc&lastName=xyz
存储库方法 Page findAllByOrganizationId(String organizationId, Example example, Pageable pageable); 应该 return 具有匹配的 organizationId 和 lastName=xyz 的所有记录,但它 return 是与组织 ID 匹配的记录以及所有学生,而不考虑 lastName。
代码有问题吗?
终于找到答案了。 findBy 和 Example Executor 不能一起工作。
通过示例执行器设置子对象过滤器和查询,如下所示。
public Page<Student> getStudentsPage(Student student, Pageable pageable) {
logger.debug("Getting Students : {}, {}", student, pageable);
//gets organization Id of the student from the session
String organizationId = userService.getUserMe().getOrganization().getId();
student.setOrganization(new Organization(organizationId));
Page<Student> studentPage = studentRepository.findAll(Example.of(student), pageable);
logger.debug("Students: {}", studentPage.getContent());
return studentPage;
}
这符合预期!!
谢谢!!