加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala Slick如何将Scala代码翻译成JDBC?

发布时间:2020-12-16 09:30:38 所属栏目:安全 来源:网络整理
导读:Slick如何翻译代码如: val q2 = for { c - Coffees if c.price 9.0 s - Suppliers if s.id === c.supID} yield (c.name,s.name)for(t - q2) println(" " + t._1 + " supplied by " + t._2) 进入JDBC? 它是否使用Scala Virtualized?它是否使用其他方法?
Slick如何翻译代码如:

val q2 = for {
  c <- Coffees if c.price < 9.0
  s <- Suppliers if s.id === c.supID
} yield (c.name,s.name)
for(t <- q2) println("  " + t._1 + " supplied by " + t._2)

进入JDBC?

它是否使用Scala Virtualized?它是否使用其他方法?

解决方法

Slick的稳定API通过所谓的嵌入式实现了这一点。你的例子显然使用了稳定的API(因为你使用===来平等而不是==)。

Slick(反过来,Scala)的优点是 – 这不是使用宏或Scala虚拟化实现的。 (侧注:Slick的实验API使用宏 – 这将允许您使用==而不是===或是)

SQL的翻译是通过以下方式实现的:

> Scala的理解语法,被转换为方法调用。
在Slick中定义的表是Monads – 他们有魔术foreach,地图,
flatMap和
过滤方法允许它们在Scala中被表示为’循环’
将它们转换为方法调用(正如代码中所示)
由the other answer by @emil-ivanov提供)。

与常规的Scala系列一样,是用于嵌套的语法糖
方法调用flatMap / map和filter;不像常规收藏,
Slick Table对象的映射和过滤器返回表示的版本
的查询,构建它与每个过滤条件(如果)或加入
(如s < - 供应商,如果s.id是c.supID) 所以q2的类型不是你惯常的收藏(作为Scala中的理解)
通常用于返回),而是查询的表示。
(正如Scala Option Monad同样适用于理解,尽管如此
不是“收藏”(按列表或地图的方式))

您可以使用q2.selectStatement查看基础查询。
> Scala的隐含提升 – c.price不是一个Int而是一个代表
列值 – 因此表达式c.price< 9.0成为c.price。<(Const(9.0))
(Int被提升到所需类型),<是一种只是一种方法
一个代表c.price的类,一列。 <方法
不做什么通常是(在普通的Ints的情况下) – 它只是返回
对应于价格< 9成为其中的一部分
生成并发送给JDBC以执行的SQL。

在细节方面还有很多其他事情,但是我认为查询monad和隐含的提升是主要的成分。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读