Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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
Spring boot Spring Boot QueryDSL BooleanExpression-”的;或;条件取决于表中的值_Spring Boot_Querydsl_Criteriaquery - Fatal编程技术网

Spring boot Spring Boot QueryDSL BooleanExpression-”的;或;条件取决于表中的值

Spring boot Spring Boot QueryDSL BooleanExpression-”的;或;条件取决于表中的值,spring-boot,querydsl,criteriaquery,Spring Boot,Querydsl,Criteriaquery,我使用SpringBoot和QueryDSL组合sql查询和谓词。问题是,我必须创建一个谓词来根据电子邮件从表中获取数据,但是: 电子邮件可以是Freight.sender.email 或者在Freight.message.senderAddress中 其中运费、邮件、发件人当然是表格。 在运费表中,我们可以有空的发件人id或邮件id,根据这一点,我必须通过电子邮件从运费.sender.email或运费.message.senderAddress(如果运费.sender为空) 是否可以创建这样一

我使用SpringBoot和QueryDSL组合sql查询和谓词。问题是,我必须创建一个谓词来根据电子邮件从表中获取数据,但是:

  • 电子邮件可以是Freight.sender.email
  • 或者在Freight.message.senderAddress中
  • 其中运费、邮件、发件人当然是表格。 在运费表中,我们可以有空的发件人id或邮件id,根据这一点,我必须通过电子邮件从
    运费.sender.email
    运费.message.senderAddress
    (如果
    运费.sender
    为空)

    是否可以创建这样一个谓词,将来自请求查询参数的电子邮件与Freight.sender.email进行比较,并且仅当Freight.sender.email不存在时,我的谓词才应在Freight.message.senderAddress中搜索电子邮件

    公共谓词生成(映射过滤器){
    返回新的OptionalBooleanBuilder(Expressions.asBoolean(true.isTrue())
    .notNullAnd(qFreight.loadingAddress::containsIgnoreCase,filters.get(LOADING_ADDRESS))
    .notNullAnd(qFreight.unloadingAddress::containsIgnoreCase,filters.get(卸载地址))
    .notNullAnd(qFreight.loadingDate.eq(filters.get(LOADING_DATE)!=null?LocalDate.parse(filters.get(LOADING_DATE)):now()),filters.get(LOADING_DATE))
    .notNullAnd(qFreight.unloadingDate.eq(filters.get(卸载日期)!=null?LocalDate.parse(filters.get(卸载日期)):now()、filters.get(卸载日期))
    //我的尝试-不起作用:
    .notNullAnd(qFreight.sender.email.eq(filters.get(sender\u email))。或(qFreight.emailMessage.senderAddress.eq(sender\u email)),filters.get(sender\u email))
    .build();
    }
    
    公共类OptionalBooleanBuilder{
    私有布尔表达式谓词;
    公共选项BooleanBuilder(BooleanExpression谓词){
    this.predicate=谓词;
    }
    公共选项BooleanBuilder notNullAnd(函数表达式函数,T值){
    if(非空(值)){
    返回新的OptionalBooleanBuilder(predicate.and(expressionFunction.apply(value));
    }
    归还这个;
    }
    公共布尔表达式构建(){
    返回谓词;
    }
    公共选项BooleanBuilder notNullAnd(BooleanExpression表达式,T值){
    if(非空(值)){
    返回新的OptionalBooleanBuilder(谓词和(表达式));
    }
    归还这个;
    }
    }
    
    更新

    根据下列人士的建议:

    private Predicate addPredicate(OptionalBooleanBuilder builder, String email) {
        if (nonNull(email)) {
            return builder.notNullAnd(qFreight.sender.email.coalesce(qFreight.emailMessage.senderAddress.eq(email)).asBoolean(), email).build();
    
        return builder.build();
    }
    
    我得到一个错误:

        antlr.NoViableAltException: unexpected AST node: (
            at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:2169) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
            at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:2089) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
            at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.whereClause(HqlSqlBaseWalker.java:827) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
            at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:621) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
            at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:325) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
            at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:273) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
            at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:276) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
            at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:192) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
    
    
    2020-12-24 00:45:35.535 ERROR 16068 --- [nio-9090-exec-8] p.a.m.s.filter.JwtAuthorizationFilter    : Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected AST node: ( near line 3, column 52 [select freight
    from pl.appwise.mtf.freight.domain.model.Freight freight
    where ?1 = ?1 and freight.user.id = ?2 and coalesce(freight.sender.email, freight.emailMessage.senderAddress = ?3)
    order by freight.loadingDate desc]; nested exception is java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected AST node: ( near line 3, column 52 [select freight
    from pl.appwise.mtf.freight.domain.model.Freight freight
    where ?1 = ?1 and freight.user.id = ?2 and coalesce(freight.sender.email, freight.emailMessage.senderAddress = ?3)
    order by freight.loadingDate desc]
    2020-12-24 00:45:37.906  INFO 16068 --- [   scheduling-1] ilAccoun
    

    使用
    运费.发件人.电子邮件.合并(运费.邮件.发件人地址)
    <如果
    运费.message
    NULL
    ,则代码>运费.message.senderAddress将为
    NULL
    。对于可选关联,默认情况下使用左外部联接,因此这不会引起任何问题。否则,请显式使用左连接。

    请参阅上面的“我的更新…”。。。。现在我得到了错误:意外的AST节点:可能是因为
    运费。发送方
    是一个关联,而不是嵌入值。必须在JPQL(JPA的查询语言)中显式地加入关联。必须首先引入联接,如下所示:
    query.leftJoin(Freight.sender,QSender.sender)
    ,然后将表达式中的
    Freight.sender.email
    替换为
    sender.email