簡體   English   中英

QueryDSL:將 BooleanExpression 列表轉換為 Predicate

[英]QueryDSL: convert list of BooleanExpression to Predicate

我正在嘗試創建一個取決於 boolean 參數數量的查詢。 創建謂詞的 function 如下所示:

Predicate createPredicate(Boolean param1, Boolean param2) {
    List<BooleanExpression> booleanExpressions = new List<>();        
    if (param1)
        booleanExpressions.add(/** expression 1 **/);
    if (param2)
        booleanExpressions.add(/** expression 2 **/);
    convertExpressionsToPredicate(booleanExpressions);
}

問題是convertExpressionsToPredicate function。querydsl 中是否有任何特殊方法可以使用or運算符將表達式列表連接到一個謂詞中?

我正在尋找的解決方案應該轉換為:

List<BooleanExpression> booleanExpressions = List(exp1, exp2, exp3);

進入:

Predicate p = exp1.or(exp2).or(exp3)

要構造復雜的布爾表達式,請使用com.querydsl.core.BooleanBuilder類。 它實現Predicate並可以級聯形式使用。 例如:

public List<Customer> getCustomer(String... names) {
    QCustomer customer = QCustomer.customer;
    JPAQuery<Customer> query = queryFactory.selectFrom(customer);
    BooleanBuilder builder = new BooleanBuilder();
    for (String name : names) {
        builder.or(customer.name.eq(name));
    }
    query.where(builder);
    return query.fetch();
}

BooleanBuilder是可變的,最初表示null。 在每次and / or調用之后它代表操作的結果。

如果有人正在使用 Spring Boot JPA 和 QueryDSL,您可以使用以下命令獲得Page<YourType>結果(在 Kotlin 中):

fun listCards(page: Int?, pageSize: Int?, orderColumnName: String?, orderDirection: Sort.Direction?, filter: CardFilter?): Page<Card> {
  val pageRequest = PageRequest.of(page ?: 0, pageSize ?: 10, orderDirection ?: Sort.Direction.ASC, orderColumnName ?: Card::cardNumber.name)
  val conditions = BooleanBuilder()
  filter?.cardNumber?.let { qCard.cardNumber.contains(it) }?.let { conditions.and(it) }
  filter?.cardHolderName?.let { qCard.cardHolderName.containsIgnoreCase(it) }?.let { conditions.and(it) }
  filter?.phoneNumber?.let { qCard.phoneNumber.contains(it) }?.let { conditions.and(it) }
  filter?.email?.let { qCard.email.contains(it) }?.let { conditions.and(it) }
  filter?.locale?.let { qCard.locale.eq(it) }?.let { conditions.and(it) }

  if (conditions.hasValue()) {
    return cardRepository.findAll(conditions.value!!, pageRequest)
  }
  return cardRepository.findAll(pageRequest)
}
ExpressionUtils.allOf(ps) // use AND join conditions, ps is a list of predicate
ExpressionUtils.anyOf(ps) // use OR join conditions, ps is a list of predicate

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM