spring 从QueryDSL predicate 对象中获取参数

9udxz4iz  于 2023-06-21  发布在  Spring
关注(0)|答案(2)|浏览(206)

我使用QueryDSL predicate 对象和一个Spring REST端点来检索和查询参数值。

@GetMapping("/{subjectId}/students")
@RolesAllowed( {Roles.PLATFORM_ADMIN, Roles.USER})
public List<StudentResponse> getAllStudents(@PathVariable final String subjectId,                                
                                      @QuerydslPredicate(root = Student.class) final Predicate predicate) {     

        final Predicate searchPredicate = studentPredicate()
                .predicate(predicate)
                .subjectId(subjectId)
                .build();
        return studentService.findBySubjectId(subjectId, searchPredicate);

}

student类包含studentIdstudentName属性;
现在,如果有人调用https://hostname/ {subjectId}/students?studentId=1234&studentName=test
然后上面的代码生成带有参数值的 predicate 对象。但是我需要从 predicate 对象中获取2个以上的参数值,以便除了数据库查询之外进行进一步处理。我没有看到任何支持的方法从 predicate 对象中检索出值。那我该怎么做?

pxq42qpu

pxq42qpu1#

要做到这一点,没有简单明了的方法。
但是你可以试试这个。
predicate.toString();--->这将打印user.Studentid=1234 && user.studentName=test
从这里,你可以做一个字符串分割。
另一种方式是与
predicate.getClass());---->这会给予你一个类的名字,比如
com.querydsl.core.types.PredicateOperation(在多个查询条件的情况下)
com.querydsl.core.types.dsl.BooleanOperation(在单个查询条件的情况下)。
这样你就可以将 predicate 类型转换为相应的类型,然后执行getArgs()

mlmc2os5

mlmc2os52#

如果使用QuerydslBinderCustomizer,则字符串不容易解析。
另一种方法是让Spring将您的查询参数绑定到 predicate 根类,在您的示例中为Student。为此,只需向控制器方法添加另一个Student类型的方法参数。然后,匹配Student属性的查询参数就可以访问,而不需要字符串解析。

@GetMapping("/{subjectId}/students")
@RolesAllowed( {Roles.PLATFORM_ADMIN, Roles.USER})
public List<StudentResponse> getAllStudents(
    Student student, // add this arg to easily access the Student related query params
    @PathVariable final String subjectId,                                
    @QuerydslPredicate(root = Student.class) final Predicate predicate) {     
    
    // now you can get the id & name without parsing predicate.toString()
    student.getStudentId();
    student.getStudentName();

相关问题