多个联合查询选择后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()) { ... } })
我在这里更详细地写了这篇博文。