【问题标题】:Query dsl - Looping through a list to create OR predicates查询 dsl - 循环遍历列表以创建 OR 谓词
【发布时间】:2023-01-25 05:40:55
【问题描述】:

如果我有 List<List<String>>,我如何动态创建“OR”谓词 我正在使用查询 dsl 和 spring 数据。

QOrder order = QOrder.order;
JPQLQuery<Order> query = from(order);
query.where(order.status.eq("ready"));
List<List<String>> filterTypes;

这就是我想要做的:

for(List<String> types : filterTypes) {
    query.where(order.type.in(types));
}

所以结果应该是这样的

select * from order o where o.status='ready' and (o.type in(t1,t2) or o.type in(t3,t4))

【问题讨论】:

    标签: java hibernate jpa spring-data-jpa querydsl


    【解决方案1】:

    直接回答您的问题:假设您使用的是相对现代版本的 QueryDSL,您应该能够使用 BooleanBuilder

    QOrder order = QOrder.order;
    SQLQuery<Order> query = from(order);
    query.where(order.status.eq("ready"));
    // Example data
    List<List<String>> filterTypes = ImmutableList.of(
            ImmutableList.of("t1", "t2"),
            ImmutableList.of("t3", "t4"));
    
    BooleanBuilder builder = new BooleanBuilder();
    
    for (List<String> types : filterTypes) {
        builder.or(order.type.in(types));
    }
    
    query.where(builder);
    

    备份,假设您的实际应用程序数据模型类似于您提供的示例,这:

    o.type in (t1,t2) or o.type in (t3,t4)
    

    相当于:

    o.type in (t1,t2,t3,t4)
    

    您可以将 List&lt;List&lt;String&gt;&gt; 翻译成 List&lt;String&gt; 并进行一次类型查询更新:

    QOrder order = QOrder.order;
    SQLQuery<Order> query = from(order);
    query.where(order.status.eq("ready"));
    // Example data
    List<List<String>> filterTypes = ImmutableList.of(
            ImmutableList.of("t1", "t2"),
            ImmutableList.of("t3", "t4"));
    List<String> flatFilterTypes = filterTypes.stream().flatMap(List::stream).collect(Collectors.toList());
    query.where(order.type.in(flatFilterTypes));
    

    怀疑你的数据库的查询优化器会对这两个查询做同样的事情(你必须检查query execution plan to be sure),但如果你在 Java 端简化查询而不是依赖,它可能会更清楚发生了什么在数据库查询优化器上。

    【讨论】:

      猜你喜欢
      • 2019-06-22
      • 2021-03-06
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-03
      • 1970-01-01
      相关资源
      最近更新 更多