Ответ 1
Слайд-стабильный API достигает этого через то, что он называет снятым вложением. В вашем примере явно используется стабильный API (поскольку вы используете ===
для равенства, а не ==
).
Красота Slick (и, в свою очередь, Scala) заключается в том, что - это многое достигается без использования макросов или Scala -Virtualized. (Side Note: Slick экспериментальный API использует макросы - и это позволит вам использовать ==
вместо ===
или is
)
Перевод в SQL достигается с помощью:
-
Scala
for
синтаксис понимания, который переводится в вызовы методов. Таблицы, определенные в Slick, Монады - у них есть волшебствоforeach
,map
,flatMap
иfilter
, которые позволяют их выражать в циклахfor
', а Scala переводит их на вызовы методов (как правильно показано в коде предоставленный другим ответом @emil-ivanov).Как и в обычных коллекциях Scala,
for
является синтаксическим сахаром для вложенных метод вызываетflatMap
/map
иfilter
; в отличие от обычных коллекций, версии SlickTable
объектовmap
иfilter
возвращают представления запроса, построив его вместе с каждым условием фильтрации (if
) или соедините (как вs <- Suppliers if s.id is c.supID
)Таким образом, тип
q2
не является вашей обычной коллекцией (как для понимания в Scala обычно используется для возврата), а скорее представление запроса. (Так же как Scala Option Monad также работает сfor
пониманиями, несмотря на не являясь "коллекцией" (таким образом, чтоList
илиmap
))Вы можете увидеть базовый запрос с помощью
q2.selectStatement
. -
Scala неявный подъем -
c.price
не являетсяInt
, а скорее представляет собой представление значение столбца - поэтому выражениеc.price < 9.0
становитсяc.price.<(Const(9.0))
(aInt
поднимается до нужного типа), а<
- это просто метод класс, который представляетc.price
, aColumn
. Метод<
не делает то, что обычно<
(в случае простогоInt
s) - он просто возвращает представление SQL AST, соответствующееprice < 9
, которое становится частью SQL, который сгенерирован и отправлен в JDBC для выполнения.
Там многое еще происходит, с точки зрения деталей, но я думаю, что монада запросов и неявный подъем являются главными ингредиентами.