Java 使用QueryDSL查询可选字段
我在试图弄清楚QueryDSL如何处理Java8可选属性时遇到了一些麻烦 我已经配置了QueryDSL,像Java 使用QueryDSL查询可选字段,java,mongodb,spring-boot,optional,querydsl,Java,Mongodb,Spring Boot,Optional,Querydsl,我在试图弄清楚QueryDSL如何处理Java8可选属性时遇到了一些麻烦 我已经配置了QueryDSL,像tests?field=value这样的查询正在处理字符串属性。但是,由于我的类的一些getter具有可选的返回类型,因此生成的QTest类包含SimplePath,而不是字符串属性的简单StringPath。见下文: 测试类 @QueryEntity @Document(collection = "test") public class Test { private String f
tests?field=value
这样的查询正在处理字符串属性。但是,由于我的类的一些getter具有可选的返回类型,因此生成的QTest类包含SimplePath
,而不是字符串属性的简单StringPath
。见下文:
测试类
@QueryEntity
@Document(collection = "test")
public class Test {
private String field;
private String optionalField;
Test(String field, String optionalField) {
this.field = field;
this.optionalField = optionalField;
}
public String getField() {
return field;
}
public Optional<String> getOptionalField() {
return Optional.ofNullable(optionalField);
}
}
@Generated("com.querydsl.codegen.EntitySerializer")
public class QTest extends EntityPathBase<Test> {
private static final long serialVersionUID = -609090735L;
public static final QTest test = new QTest("test");
public final StringPath field = createString("field");
public final ComparablePath<java.util.UUID> id = createComparable("id", java.util.UUID.class);
public final SimplePath<java.util.Optional<String>> optionalField = createSimple("optionalField", java.util.Optional.class);
}
控制员:
@RestController
@RequestMapping("/tests")
public class TestController {
private final TestService testService;
@Inject
public TestController (final TestService testService) {
this.testService = testService;
}
@GetMapping()
public ResponseEntity<Page<Test>> getAllWithPredicate(Pageable pageable,
@QuerydslPredicate(root = Test.class) Predicate predicate) {
return new ResponseEntity<>(this.testService.getAllTestsWithPredicate(pageable, predicate), HttpStatus.OK);
}
@PostMapping
public ResponseEntity<Test> createTest(@RequestBody Test test) {
return new ResponseEntity<>(this.testService.createTest(test), HttpStatus.CREATED);
}
}
这似乎是一种正常的行为,因为为该字段生成了QTest类型(SimplePath
而不是StringPath
),但事实是我找不到任何有效的方法来处理此optionalField
因此,我的问题是:
QueryDSL是否可以使用可选值
值?如果是这样,我该如何查询这些字段
谢谢你的帮助!:) 使用BooleanBuilder感谢您的回答@DEBENDRA-DHINDA,但很抱歉,我不知道如何使用BooleanBuilder执行此操作?因为对于我来说,BooleanBuilder在控制器方法中接收可选参数以在这些参数中执行或/和操作时非常有用。在我的例子中,我希望接收一个谓词,因为我无法编写接收对象属性的各种组合的控制器方法。谢谢。使用BooleanBuilder谢谢您的回答@DEBENDRA-DHINDA,但很抱歉,我不知道如何使用BooleanBuilder执行此操作?因为对于我来说,BooleanBuilder在控制器方法中接收可选参数以在这些参数中执行或/和操作时非常有用。在我的例子中,我希望接收一个谓词,因为我无法编写接收对象属性的各种组合的控制器方法。非常感谢。
@RestController
@RequestMapping("/tests")
public class TestController {
private final TestService testService;
@Inject
public TestController (final TestService testService) {
this.testService = testService;
}
@GetMapping()
public ResponseEntity<Page<Test>> getAllWithPredicate(Pageable pageable,
@QuerydslPredicate(root = Test.class) Predicate predicate) {
return new ResponseEntity<>(this.testService.getAllTestsWithPredicate(pageable, predicate), HttpStatus.OK);
}
@PostMapping
public ResponseEntity<Test> createTest(@RequestBody Test test) {
return new ResponseEntity<>(this.testService.createTest(test), HttpStatus.CREATED);
}
}
@Service
public class TestService {
private final TestRepository testRepository;
@Inject
public TestService(final TestRepository repo) {
this.testRepository = repo;
}
public Page<Test> getAllTestsWithPredicate(Pageable pageable, Predicate predicate) {
return this.testRepository.findAll(predicate, pageable);
}
public Test createTest(Test test) {
Test savedTest = testRepository.save(test);
return savedTest;
}
}
@Repository
public interface TestRepository extends JpaRepository<Test, String>, QuerydslPredicateExecutor<Test>, QuerydslBinderCustomizer<QTest> {
@Override
default public void customize(QuerydslBindings bindings, QTest root) {
bindings.bind(String.class).first((StringPath path, String value) -> path.containsIgnoreCase(value));
}
}
java.lang.ClassCastException: com.querydsl.core.types.dsl.SimplePath cannot be cast to com.querydsl.core.types.dsl.StringPath
at org.springframework.data.querydsl.binding.QuerydslBindings$MultiValueBindingAdapter.bind(QuerydslBindings.java:506) ~[spring-data-commons-1.13.10.RELEASE.jar:na]
at org.springframework.data.querydsl.binding.QuerydslPredicateBuilder.invokeBinding(QuerydslPredicateBuilder.java:139) ~[spring-data-commons-1.13.10.RELEASE.jar:na]
at org.springframework.data.querydsl.binding.QuerydslPredicateBuilder.getPredicate(QuerydslPredicateBuilder.java:113) ~[spring-data-commons-1.13.10.RELEASE.jar:na]
...