Выберите запрос как условие в Exposed - PullRequest
0 голосов
/ 14 февраля 2019

Как использовать метод DSL для генерации SELECT запроса в WHERE?

Пример:

SELECT *
FROM table
WHERE id IN (
    SELECT MAX(id)
    FROM table
    GROUP BY name
);

1 Ответ

0 голосов
/ 14 февраля 2019

После поиска я обнаружил эту проблему на GitHub.wrapAsExpression можно использовать для создания подзапроса.

  1. Копировать EqOp и преобразовать его в InOp

    class InOp(expr1: Expression<*>, expr2: Expression<*>) : ComparisonOp(expr1, expr2, "IN")
    
  2. Копировать eq затем преобразуйте его в inExpr функцию расширения

    infix fun<T, S1: T?, S2: T?> Expression<in S1>.inExpr(other: Expression<in S2>) : 
    Op<Boolean> = InOp(this, other)
    
  3. Используйте их

    Table.run {
        select { id inExpr wrapAsExpression(slice(id.max()).selectAll().groupBy(column)) }
    }
    

Пример вывода:

SELECT `user`.id, `user`.name, FROM `user` WHERE `user`.id IN (SELECT MAX(`user`.id) FROM `user` GROUP BY `user`.name)
...