如何解决Spring数据mongoDB:使用Example Executor和Pageable通过子对象ID查找所有对象
我在查询存储库时遇到问题,该存储库只能通过子对象ID,示例和Pageable进行查找。
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
存储库方法 页面findAllByOrganizationId(字符串OrganizationId,示例示例,Pageable pageable); 应该返回所有具有匹配的OrganizationId和lastName = xyz的记录,但是它将返回与组织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;
}
这按预期工作!
谢谢!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。