当前位置: 首页 > 知识库问答 >
问题:

Spring data mongoDB:使用示例执行器和可分页的子对象ID查找所有

楚天宇
2023-03-14

我在查询存储库时遇到了通过子对象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;
    }
}

学生存储库.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

存储库方法Page findAllByOrganizationId(String organizationId,示例,Pageable Pageable);应该返回具有匹配organizationId和lastName=xyz的所有记录,但它将返回与组织Id匹配的记录以及所有学生,而不考虑lastName。

代码有问题吗?

共有1个答案

段弘和
2023-03-14

终于找到了答案。findBy 和示例执行器不能协同工作。

通过设置子对象筛选器并通过示例执行器查询,如下所示。

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;
    }    

这个果然管用!!

谢谢

 类似资料:
  • 问题内容: 我必须编写一个脚本来查找目录中的所有可执行文件。因此,我尝试了几种实现它的方法,它们实际上起作用了。但是我想知道是否有更好的方法。 所以这是我的第一种方法: 这很好用,因为-F标志为我完成了工作,并在每个可执行文件中添加了一个星号,但可以说我不喜欢该星号。 这是第二种方法: 这也很好用,我想用破折号作为第一个字符,然后我对接下来的两个字符不感兴趣,而第四个字符必须是x。 但是需求中有些

  • 我有以下代码用于在对Mongoose数据库的API调用中获取路由,我想使用一个查询字符串来查找包含各种单词的所有项,示例路径是: /CPU=I3&Username=Bob 这将导致所有CPU中包含i3的用户都使用包含bob的名称(一个奇怪的例子!)。 CPU可以是任何一代的,并且实际上包含以下内容: Intel(R)Core(TM)i3-8109U CPU@3.00 GHz或Intel(R)Cor

  • 你会认为这是一件简单的事情。我有一个在我的集合中的对象ID列表。我想根据对象ID获得一条记录。谷歌过,但没有任何帮助。 所以我有对象id:5106c7703abc120a04070b34 此打印: 我试过上述发现的不同版本。它们都无法编译: 查找({_id= 它们都不起作用。如何使用对象id查找(findone)单个记录??

  • 问题内容: 在python中找到对对象的所有引用的好方法是什么? 我问的原因是看起来我们有“内存泄漏”。我们正在将图像文件从Web浏览器上传到服务器。每次执行此操作时,服务器上的内存使用量都会与刚刚上传的文件的大小成比例地增加。python垃圾回收永远不会释放该内存,因此我认为即使在每次请求结束时,也可能存在指向图像数据的流浪引用,这些引用并没有被删除或超出范围。 我认为能够问python很好:“

  • 问题内容: 关于我之前的问题,我想确保所有子对象都已加载,因为我有多个线程可能需要访问数据(从而避免延迟加载异常)。我知道执行此操作的方法是在查询(EJB QL)中使用“fetch”关键字。像这样: 假设模型中包含一个类。 我的问题是,似乎需要“ distinct”关键字,否则我似乎会为每个关键字找回一个。我做对了吗? 也许更重要的是,是否有一种方法可以拉入所有子对象,无论深度如何?我们大约有10

  • 我用的是Spring。我有一个用户表。 当一个人登录系统时,他会向我发送他的凭证(即用户名和密码)。 我用增量生成的uid(即userid是主键)将我的用户存储在数据库中。 我还在数据库中存储了用户名、密码等信息。我需要做的是,当用户连接到Rest连接时,我需要检查数据库是否有这个用户。如果他存在,那么我需要检查密码是否匹配。我需要通过用户名而不是uid进行检查 我的程序中根本没有会话或任何东西(