多个联合查询选择后java 8

这是我想在MySQL中尝试的查询

SELECT Ax FROM A WHERE Ay = 'P' UNION SELECT Ax FROM A WHERE Ay = 'Q' 

以上是我正在尝试的原始查询的简化版本。 在我的原始查询中,每个SELECT语句都涉及带有INNER JOIN多个表

如果我需要查询的表’A’的’y’列中可能的值的数量是’n’,那么我的查询将涉及在’ SELECT语句上执行’n-1’联合

我知道JOOQ可以组合多个SELECT语句。 但是有没有一个很好的方法来发布Java 8风格? 也许使用Steam.collect()?

这就是我的想法,但我想知道我是否能做得更好

 String firstValueToQuery = valuesToQuery.get(0); Select<Record5> selectQuery = getSelectQueryForValue(firstValueToQuery); valuesToQuery.stream() .skip(1) .forEach(valueToQuery -> selectQuery.unionAll(getSelectQueryForValue(valueToQuery))); selectQuery.fetchStream(); 

这是我实现getSelectQueryForValue

 private Select<Record5> getSelectQueryForValue(String valueToQuery) { return jooq.select( AP, AQ, AR, AS, AT) .from(A) .where(AYeq(valueToQuery)); } 

PS:据我所知,我宁可使用下面的’IN’子句

 SELECT Ax FROM A WHERE Ay IN ('P','Q',...) 

但是由于我目前在数据库中的数据分布,MySQL正在使用次优查询计划。 因此,使用UNION,以便数据库通过使用正确的索引隐式地更喜欢更快的查询计划

这里惯用的方法如下(使用JDK 9 API):

 try (Stream> stream = valuesToQuery .stream() .map(this::getSelectQueryForValue) .reduce(Select::union) .stream() // JDK 9 method .flatMap(Select::fetchStream)) { ... } 

它使用了在JDK 9中添加的有用的Optional.stream()方法。在JDK 8中,您可以这样做:

 valuesToQuery .stream() .map(this::getSelectQueryForValue) .reduce(Select::union) .ifPresent(s -> { try (Stream> stream = s.fetchStream()) { ... } }) 

我在这里更详细地写了这篇博文。