使用scala slick重写此SQL查询

詹姆士 :
class ItemTable(tag: Tag) extends Table[Item](tag, _tableName = "items") {

  def id: Rep[Int] = column[Int]("id", O.PrimaryKey, O.AutoInc)
  def authId: Rep[String] = column[String]("auth_id")
  def productId: Rep[Int] = column[Int]("product_id")
  def position: Rep[Int] = column[Int]("position")

  override def * : ProvenShape[Item] = (id, authId, productId, position) <> ((Item.apply _).tupled, Item.unapply)
}


class ItemService @Inject()(protected val dbConfigProvider: DatabaseConfigProvider)(implicit executionContext: ExecutionContext) {

    private lazy val query = TableQuery[ItemTable]
    def updateItem(item: Item, previousPosition: Int): Future[Item] = {

        if (previousPosition < item.position) {
          // this is the sql I want to convert to slick
          db.run(sqlu""" UPDATE #${query.baseTableRow.tableName} SET position = position - 1 WHERE position >= #$previousPosition AND position <= #${item.position} AND auth_id = '#${item.authId}'""")
        }
        else if (previousPosition > item.position) {
          db.run(sqlu""" UPDATE #${query.baseTableRow.tableName} SET position = position + 1 WHERE position <= #$previousPosition AND position >= #${item.position} AND auth_id = '#${item.authId}' """)
        }
        else {
         // some other code
        }
    }
}

case class Item(id: Int, authId: String, productId: Int, position: Int){}

我的SQL可以正常工作,我被困在这里将其翻译成光滑的代码。

val q2 = query.filter(f=> f.authId === item.authId && f.position >= previousPosition && f.position <= item.position)

//我不知道如何更新多个或将结果集传递给update函数

理查德·达拉威(Richard Dallaway):

Slick的嵌入式样式不支持表单的动态突变批量更新SET position = position + 1Slick问题497)。

这意味着在这里使用正确的SQL风格是正确的方法。

关于惯用语的附加说明sqlu:我注意到sqlu您使用了“拼接”(#$表名)。这样可以防止Slick将值视为字符串,这适合您的工作。但是,以后的用法#$previousPosition通常会写成纯替换$previousPosition那是因为您通常希望Slick正确地转义那里的SQL参数。它可能对整数没有影响,但对其他数据类型则可能有所不同。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何以功能性而非可变的方式执行此Scala SQL(Slick 1.0.1)查询?

如何使用DynamoDB DocumentClient重写此查询?

是否可以使用SubQuery而不是自联接重写此CosmosDb SQL查询?

有没有办法使用Laravel查询生成器重写此原始SQL查询

需要重写此查询,而无需使用相关子查询

如何使用Scala Slick 3发送普通的SQL查询(和检索结果)

如何重写此Linq查询以避免使用FirstOrDefault?

不使用%的SQL Server重写查询

使用Django db Api重写SQL查询

如何使用 knex 重写原始 sql 查询?

如何使用过滤器和 groupBy 在 Scala 和 Quill 中表达此 SQL 查询?

在Spark SQL查询中使用Scala列表

如何使用JPA进行此SQL查询?

如何使用 javascript 转换此 sql 查询?

使用 Slick Plain Sql 查询删除所有表

如何使用Slick 3从SQL select查询中获取结果

如何使用max函数重写此“无效使用组函数”查询以查找排名

如何在Doctrine查询生成器中改进/重写此查询(不与子查询一起使用)

如何在Hive中使用多子查询重写SQL

有什么方法可以使用 IN 和 COUNT 重写此查询?

如何重写此Oracle查询以使用有效的CTE

如何使用函数式编程方法在Scala中重写此代码

使用Scala Slick创建合成主键

使用可选列更新Scala Slick行

使用Slick Table的Scala类型推断

使用Slick将MySQL连接到Scala

在scala slick中使用几列动态排序

在Play Framework中使用写入Slick 3.0 Scala查询的“正确”方法

如何使用Scala Slick 2.0在.where()子句中生成OR查询?