Slick 3.1.x CRUD:如何提取整个最新的插入行?
Slick 3.1.x CRUD: how to extract the entire up-to-date inserted row?
基本上我想使用 Slick 并以通用的 DAO 模型独立方式插入并同时检索最新的实体行数据。
我之前问过这个问题 ,最后成功解决了这个问题。但是,由于以下原因,该方法并不是最佳方法:
- 它假定每个模型都有一个
id
属性,但情况可能并非总是如此。这仅适用于强大的实体,不适用于例如。一对多的弱实体,当然必须将 id
命名为 id
是一件令人讨厌的事情。
- 可能还有其他字段会在插入时填充,例如可能的
modified
时间戳或任何自定义数据库触发修改,而不仅仅是 id
或 modified
因此,我想找到一个解决方案来插入新实体,同时取出整个新实体行,而不仅仅是 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(??? = ???))
我们所做的是为 classic、syntetic、autoincrement ID BaseDaoAutoInc
提供一个基础 class。对于其他情况,我们使用其他基 class 定义(除其他外)如下方法:
findById
(无论这个 ID 实际是什么)。
因此,对于我们希望在插入后获取整行的情况(例如,当我们有一些由数据库生成的值(例如当前时间戳等)时),我们通常会这样做:
(tableQuery += newEntry).flatMap(_ => findById(newEntry.??))
以上假定您没有自动生成的密钥(并且您在插入时知道)。如果您已经生成密钥并且需要在插入后读取对象,那么您需要将此 returning
部分添加到上面的代码中以首先获取自动生成的 ID,然后再获取整行。
基本上我想使用 Slick 并以通用的 DAO 模型独立方式插入并同时检索最新的实体行数据。
我之前问过这个问题
- 它假定每个模型都有一个
id
属性,但情况可能并非总是如此。这仅适用于强大的实体,不适用于例如。一对多的弱实体,当然必须将id
命名为id
是一件令人讨厌的事情。 - 可能还有其他字段会在插入时填充,例如可能的
modified
时间戳或任何自定义数据库触发修改,而不仅仅是id
或modified
因此,我想找到一个解决方案来插入新实体,同时取出整个新实体行,而不仅仅是 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(??? = ???))
我们所做的是为 classic、syntetic、autoincrement ID BaseDaoAutoInc
提供一个基础 class。对于其他情况,我们使用其他基 class 定义(除其他外)如下方法:
findById
(无论这个 ID 实际是什么)。
因此,对于我们希望在插入后获取整行的情况(例如,当我们有一些由数据库生成的值(例如当前时间戳等)时),我们通常会这样做:
(tableQuery += newEntry).flatMap(_ => findById(newEntry.??))
以上假定您没有自动生成的密钥(并且您在插入时知道)。如果您已经生成密钥并且需要在插入后读取对象,那么您需要将此 returning
部分添加到上面的代码中以首先获取自动生成的 ID,然后再获取整行。