java 8后具有多个选择的联合查询

2024-04-25

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

SELECT A.x
FROM A
WHERE A.y = 'P'
UNION
SELECT A.x
FROM A
WHERE A.y = 'Q'

上面是我正在尝试的原始查询的精简版、简单得多的版本。在我原来的查询中,每个SELECT语句涉及多个表INNER JOIN

如果我需要查询的表“A”的“y”列中可能的值数量为“n”,那么我的查询将涉及对“n”执行“n-1”并集SELECT声明

我知道JOOQ可以进行多个联合SELECT声明。但是有没有一个好的方法来实现这种后 Java 8 风格呢?也许使用 Steam.collect()?

这就是我所拥有的,但想知道我是否可以做得更好

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

这是我的实现方式getSelectQueryForValue

private Select<Record5<UUID, UUID, String, Integer, String>> getSelectQueryForValue(String valueToQuery) {
        return jooq.select(
                A.P,
                A.Q,
                A.R,
                A.S,
                A.T)
                .from(A)
                .where(A.Y.eq(valueToQuery));
    }

PS:我知道我宁愿使用“IN”子句,如下所示

SELECT A.x
FROM A
WHERE A.y IN ('P','Q',...)

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


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

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

它使用有用的Optional.stream() https://docs.oracle.com/javase/9/docs/api/java/util/Optional.html#stream--方法,该方法是在 JDK 9 中添加的。在 JDK 8 中,您可以这样做:

valuesToQuery
    .stream()
    .map(this::getSelectQueryForValue)
    .reduce(Select::union)
    .ifPresent(s -> {
        try (Stream<Record5<UUID, UUID, String, Integer, String>> stream = 
             s.fetchStream()) {
            ...
        }
    })

我在博客中更详细地介绍了这一点。 https://blog.jooq.org/2018/02/27/map-reducing-a-set-of-values-into-a-dynamic-sql-union-query/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java 8后具有多个选择的联合查询 的相关文章

随机推荐