- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我厌倦了总是执行如下操作,以便使用 slick 为每个我的域实体进行数据库访问。
database withSession {
implicit session =>
val entities = TableQuery[EntityTable]
val id = //Some ID
val q = for {
e <- entities if e.id === id
} yield (e)
val entity = q.first
}
(注意:EntityTable 的定义如 here 所示)
所以我决定需要一个通用的数据库访问对象来为我处理这个问题。用法应该类似于
[...]
val entityDAO = new GenericDAO[Entity, EntityTable, String]()
[...]
database withSession { implicit session =>
val id = // Some ID
val entity = entityDAO.get(id)
}
我对 GenericDAO 实现的尝试如下所示
class GenericDAO[T, TB, PK](implicit session: Session) {
val entities = TableQuery[TB] // Line 1
def get(id: PK): T = {
val q = for {
e <- entities
} yield (e)
val res: T = q.first
res
}
}
但是第 1 行给我留下了一个编译器错误,指出 TB 参数有问题。
Multiple markers at this line - type arguments [TB] conform to the bounds of none of the overloaded alternatives of value apply: [E <: scala.slick.lifted.AbstractTable[]]=> scala.slick.lifted.TableQuery[E,E#TableElementType] [E <: scala.slick.lifted.AbstractTable[]](cons: scala.slick.lifted.Tag => E)scala.slick.lifted.TableQuery[E,E#TableElementType] - wrong number of type parameters for overloaded method value apply with alternatives: [E <: scala.slick.lifted.AbstractTable[]]=> scala.slick.lifted.TableQuery[E,E#TableElementType] [E <:
scala.slick.lifted.AbstractTable[]](cons: scala.slick.lifted.Tag => E)scala.slick.lifted.TableQuery[E,E#TableElementType]
对于这个问题有什么建议吗?或者也许我错了,应该以另一种方式实现。我愿意接受任何解决方案。谢谢!
最佳答案
首先,你可以这样写
val entities = TableQuery[EntityTable] // put in a central place for re-use
然后
database.withSession(
(for {
e <- entities if e.id === /*Some ID*/
} yield e).first()(_)
)
或者这个
database.withSession(entities.filter(_.id === /*Some ID*/).first()(_))
或者这个
val get = entities.findBy(_.id) // <- reuse this
database.withSession(get(/*Some ID*/).first()(_))
为简洁起见。这可能会让你的整个 DAO 变得不必要(这太棒了:)!)。
关于您收到的错误消息。 TableQuery[TB]
是一个宏,它是 TableQuery(tag => new TB(tag))
的简写, TB
必须是Table
并支持对象创建。您不能只使用 TableQuery
从 DAO 包装器获得的无约束类型参数上的宏。你可以约束 TB <: Table[_]
但它仍然不支持对象创建,这是您在 Scala 中无法限制的。您只能向 DAO 提供一个工厂(一种常见的模式是获取一个工厂作为隐式参数),但是当您只需编写一次 TableQuery 并将其存储在全局可访问的位置时,这一切都没有意义。
更新:
该快捷方式以相同的方式适用于所有这些方法。这是简单的 Scala。你只需要把方法变成一个函数,然后传递给高阶函数withSession,它需要一个从session到anything的函数。请注意,某些 Slick 方法有一个空参数列表,这需要 ()(_)
把它们变成一个函数,有些只有隐式参数列表,只需要 (_)
。例如。 database.withSession(entities.filter(_.id === /*Some ID*/).delete(_))
.
如果您想知道_
。 Scala 将方法与函数区分开来。定义foo(a: A, b: B, ...): R
是一个方法,但可以转换为 (A,B,C) => R
类型的函数使用foo _
。这种转换称为 eta 扩展,通过谷歌搜索可以找到更多信息。有时,当需要一个函数,但您提供了一个方法时,Scala 编译器会推断 _
并且您不必明确地编写它。您还可以提供一些参数并使用 _
代替您还不想应用的参数。在这种情况下,您部分应用该方法并返回一个函数。这就是我们在这里所做的。我们使用_
在方法通常期望 session 并返回需要 session 的函数的地方。到底什么时候你必须使用 _
或(_)
或()(_)
与方法签名以及隐式参数列表、无效方法、具有空参数列表的方法之间的详细相互作用有关,这是在某些时候值得研究的一般 Scala 知识。
关于scala - 为 slick 构建通用 DAO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21729852/
这是非常非常令人沮丧的。一段时间以来,我一直在尝试使用 Slick,但障碍不断涌现。 Slick 的概念真的很棒,但是很难学,而且不像Scala,它没有“初学者”、“中级”和“高级”风格,各个阶段的人
我在 Event 上定义了一个可选的外键,它转到 EventType。我想查询所有事件,即使是那些具有 None (null) 事件类型的事件。这是在 Event 上定义的外键。 def eventT
Another question通过在“一”案例类 (Directorate) 中定义一个返回“多”类的 Seq 的方法来回答如何定义一对多关联(服务区)。但它没有解决问题的“双向”部分。 使用该示例
我有一个向表中添加日期列的要求,默认值是由 oracle 的 sysdate 设置的,如下所示 例子{...CREATED_ON DATE 默认系统日期 我想使用 slick table ddl 创建
当我设置 speed: 1000 , pauseOnHover工作正常,但一旦我将其设置为 speed: 10000 , pauseOnHover不能立即工作 - 它在几秒钟后工作。 代码: $('#
我正在 try catch Slick 3.x 中的 SQL 错误。下面的代码不打印任何内容,但如果在调试下跟踪,它工作正常(它打印失败)。这段代码有什么问题? object TestSlick ex
我正在 try catch Slick 3.x 中的 SQL 错误。下面的代码不打印任何内容,但如果在调试下跟踪,它工作正常(它打印失败)。这段代码有什么问题? object TestSlick ex
我一直在使用 Slick's insertOrUpdate since its release in 2.1版本没有任何问题。 现在我正在尝试提高我的代码性能,而 insertOrUpdate 是瓶颈
我有一个列类型为日期的表。此列接受空值,因此,我将其声明为一个选项(请参阅下面的字段 perDate)。问题显然是从/到 java.time.LocalDate 的隐式转换/java.sql.Date
我试图在拖动幻灯片时向 a 标签添加“slick active”类。该类在单击时应用,但无法弄清楚如何将其应用到其他类! 如果能帮助破译我的代码,我们将不胜感激! JS $(document).rea
我有透明背景的 slider ,我想在悬停中心 div 时为 slider 背景制作动画,但在 slider 移动后,悬停效果会卡在所有以前具有“光滑中心”类的幻灯片上。任何建议如何解决它? Sp 到
我使用 Slick 3.1 代码生成器来创建默认对象和特征 Tables.scala 下面的方法有效,但我想隐式或显式地将 UserRow 和 PasswordsRow 转换为 User 和 User
我正在使用 Slick Slider 和 Slider Syncing 选项。是否可以滚动“缩略图”(示例中为 .slider-nav)而不更改主图像(示例中为 .slider-for)? 我只想在您
似乎 vue-slick 还没有提供任何事件(afterChange、beforeChange、Swipe...)。就像 jQuery 版本一样。 我应该使用 MutationObserver 来监听
问题 我正在 WordPress 网站上设置一个灵活的 slider /轮播。一切工作/显示都很完美,但是 slider 已停止正确拖动。 我仍然可以用鼠标物理拖动 slider ,它会按应有的方式进
我正在尝试使用 slick 库实现 slider 同步。我有一组来自后端的名为 pictures 的图像。我遍历这些图像,将它们填充到我的 slider-for 和 slider-nav div 下。
不知何故,我无法正确使用 slick carousel ( http://kenwheeler.github.io/slick/ )。 我收到以下错误: Uncaught TypeError: $(.
我正在使用 AOS 在滚动条上显示 html 元素。它单独运行良好,但当我在包含 Slick slider 的页面上使用它时,应用 AOS 的元素不显示。元素被隐藏,如果有很多滚动,看起来浏览器向 A
我正在使用 AOS 在滚动条上显示 html 元素。它单独运行良好,但当我在包含 Slick slider 的页面上使用它时,应用 AOS 的元素不显示。元素被隐藏,如果有很多滚动,看起来浏览器向 A
在我测试slick.js 前端 slider 插件时,我发现在Chrome 浏览器中,有时导航点在class ".slick-dots li button:before" 突然变了 来自 内容:'•'
我是一名优秀的程序员,十分优秀!