直接回答您的问题:假设您使用的是相对现代版本的 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<List<String>> 翻译成 List<String> 并进行一次类型查询更新:
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 端简化查询而不是依赖,它可能会更清楚发生了什么在数据库查询优化器上。