光滑3.1.x CRUD:如何提取整个最新插入的行?

时间:2016-11-29 12:25:51

标签: scala slick

基本上我想使用Slick并以通用的DAO模型独立方式插入并同时检索最新的实体行数据。

我之前问过这个问题Slick 3.1.x CRUD: how to extract the inserted row id?,最后设法让它运转起来。但是,由于以下原因,这种方法并不是最优的:

  • 它假设每个模型都有id属性,但情况可能并非总是如此。这仅适用于强实体,而不适用于例如强实体。一对多弱实体,当然不得不将id命名为id,这是令人讨厌的。
  • 在插入时可能会填充其他字段,例如可能的modified时间戳或任何自定义数据库触发器修改,而不仅仅是idmodified

因此,我想找到一个插入新实体的解决方案,同时取出整个新的Entity行而不仅仅是id。所以不要这样做:

val insertQuery = User returning User.map(_.id) into ((row, id) => row.copy(id = id))

更像是:

val insertQuery = User returning User.map(_) into ((row, ???) => row.copy(??? = ???))

1 个答案:

答案 0 :(得分:1)

我们所做的是拥有经典,同步,自动增量ID float[,]的基类。对于其他情况,我们使用了其他基类,它定义了(以及其他)方法,如: BaseDaoAutoInc(无论这个ID到底是什么)。

因此,对于我们希望在插入后获取完整行的情况(例如,当我们有数据库生成的某些值,例如当前时间戳等)时,我们通常会这样做:

findById

以上假设您没有自动生成密钥(并且您在插入时知道它)。如果您已经生成了键,并且需要在插入后读取对象,则需要将此(tableQuery += newEntry).flatMap(_ => findById(newEntry.??))部分添加到上面的代码中,以先获取自动生成的ID然后再获取完整行。