[英]Spring data mongoDB : Find all by child object id with Example Executor and Pageable
I am facing issue in querying repository with find all by child object ID, Example and Pageable.我在通过子 object ID、Example 和 Pageable 查询存储库时遇到问题。
StudentController.java 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 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 StudentRepository.java
@Repository
public interface StudentRepository extends MongoRepository<Student, String> {
Page<Student> findAllByOrganizationId(String organizationId, Example<Student> example, Pageable pageable);
}
Student.java学生.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组织机构.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 + "]";
}
}
The GET API request: http://localhost:8080/students?page=0&size=10&sort=id,desc&lastName=xyz GET API 请求:http://localhost:8080/students?page=0&size=10&sort=id,desc&lastName=xyz
the repository method Page findAllByOrganizationId(String organizationId, Example example, Pageable pageable);存储库方法 Page findAllByOrganizationId(String organizationId, Example example, Pageable pageable); should return all the records with matching organizationId and lastName=xyz, But it returns the records that match with the organization Id along with all the students irrespective of the lastName.
应该返回与组织 ID 和 lastName=xyz 匹配的所有记录,但它会返回与组织 ID 匹配的记录以及所有学生,而与姓氏无关。
Is something wrong with the code?代码有问题吗?
Thank You!谢谢你!
Finally found answer.终于找到答案了。 findBy and Example Executor doesn't work together.
findBy 和 Example Executor 不能一起工作。
By setting the child object filter and query by Example Executor as shown below.通过设置子 object 过滤器和示例执行器查询,如下所示。
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;
}
This works as expected!!这按预期工作!
Thanks!!谢谢!!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.