Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用QueryDSL查询可选字段_Java_Mongodb_Spring Boot_Optional_Querydsl - Fatal编程技术网

Java 使用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

我在试图弄清楚QueryDSL如何处理Java8可选属性时遇到了一些麻烦

我已经配置了QueryDSL,像
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]
...