返回计算结果为 true 的 QueryDSL 布尔表达式

2022-09-04 05:02:25

假设我有具有以下属性的豆子:CustomerQueryInfo

  • 字符串名字
  • 字符串姓氏
  • 状态枚举状态

我想使用此对象执行“QueryDSL”搜索,该对象将返回客户列表 。List<Customer>

如果其中一个字段是 ,我不想在搜索中使用它。因此,所有三个字段都设置为 null 的对象将返回所有客户CustomerQueryInfonullCustomerQueryInfo

我正在寻找使用QueryDSL执行此类搜索的最佳实践。

是这样的OK:

private BooleanExpression isFirstNameLike(String firstName){
    if(firstName==null)
        return true BooleanExpression somehow;
    return QCustomer.customer.firstName.like(firstName);
}

private BooleanExpression isStatutEq(StatusEnum status){
    if(status==null)
        return true BooleanExpression somehow;
    return QCustomer.customer.status.eq(status);
}

然后:

return query.from(customer).where(isFirstNameLike(customerQueryInfo.getFirstName).and(isLastNameLike(customerQueryInfo.getLastName).and(isStatusEq(customerQueryInfo.getStatus))).list;
  1. 如何返回计算结果为 true 的 a?BooleanExpression
  2. 如果上述方法不可取,那么推荐的最佳实践是什么?

答案 1

如何返回计算结果为 true 的布尔表达式?

BooleanExpression alwaysTrue = Expressions.asBoolean(true).isTrue();

答案 2

您可以安全地使用如下所示的空谓词

private BooleanExpression isFirstNameLike(String firstName){
    return firstName != null ? customer.firstName.like(firstName) : null;        
}

private BooleanExpression isStatusEq(StatusEnum status){
    return status != null ? customer.status.eq(status) : null;
}

并使用变色方面的地方

query.from(customer)
     .where(
         isFirstNameLike(customerQueryInfo.getFirstName()),
         isLastNameLike(customerQueryInfo.getLastName()),
         isStatusEq(customerQueryInfo.getStatus()))
     .list(customer);