Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用scala slick重写此SQL查询 类ItemTable(tag:tag)扩展了表[Item](tag,_tableName=“items”){ def id:Rep[Int]=列[Int](“id”,O.PrimaryKey,O.AutoInc) def authId:Rep[String]=列[String](“auth_id”) def productId:Rep[Int]=列[Int](“产品id”) 定义位置:Rep[Int]=列[Int](“位置”) override def*:ProvenShape[项目]=(id、authId、productId、position)((Item.apply 41;).tuple,Item.unapply) } 类ItemService@Inject()(受保护的val dbConfigProvider:DatabaseConfigProvider)(隐式executionContext:executionContext){ private lazy val query=TableQuery[ItemTable] def updateItem(项目:项目,先前位置:Int):未来[项目]={ if(先前位置=#$previousPosition和position_Mysql_Scala_Slick - Fatal编程技术网

Mysql 使用scala slick重写此SQL查询 类ItemTable(tag:tag)扩展了表[Item](tag,_tableName=“items”){ def id:Rep[Int]=列[Int](“id”,O.PrimaryKey,O.AutoInc) def authId:Rep[String]=列[String](“auth_id”) def productId:Rep[Int]=列[Int](“产品id”) 定义位置:Rep[Int]=列[Int](“位置”) override def*:ProvenShape[项目]=(id、authId、productId、position)((Item.apply 41;).tuple,Item.unapply) } 类ItemService@Inject()(受保护的val dbConfigProvider:DatabaseConfigProvider)(隐式executionContext:executionContext){ private lazy val query=TableQuery[ItemTable] def updateItem(项目:项目,先前位置:Int):未来[项目]={ if(先前位置=#$previousPosition和position

Mysql 使用scala slick重写此SQL查询 类ItemTable(tag:tag)扩展了表[Item](tag,_tableName=“items”){ def id:Rep[Int]=列[Int](“id”,O.PrimaryKey,O.AutoInc) def authId:Rep[String]=列[String](“auth_id”) def productId:Rep[Int]=列[Int](“产品id”) 定义位置:Rep[Int]=列[Int](“位置”) override def*:ProvenShape[项目]=(id、authId、productId、position)((Item.apply 41;).tuple,Item.unapply) } 类ItemService@Inject()(受保护的val dbConfigProvider:DatabaseConfigProvider)(隐式executionContext:executionContext){ private lazy val query=TableQuery[ItemTable] def updateItem(项目:项目,先前位置:Int):未来[项目]={ if(先前位置=#$previousPosition和position,mysql,scala,slick,Mysql,Scala,Slick,嵌入的Slick样式不支持表单SET position=position+1()的动态突变批量更新 这意味着在这里,使用您已有的纯SQL样式是正确的方法 关于惯用的sqlu:我注意到您的sqlu使用了“拼接”($作为表名)。这可以防止Slick将值视为字符串,这对于您正在执行的操作是合适的。但是后面的用法#$previousPosition将更典型地编写为一个简单的替换,$previousPosition。这是因为您通常希望那里的SQL参数由Slick正确转义。可能是这样的对整数没有影响,但对其

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

这意味着在这里,使用您已有的纯SQL样式是正确的方法


关于惯用的
sqlu
:我注意到您的
sqlu
使用了“拼接”(
$
作为表名)。这可以防止Slick将值视为字符串,这对于您正在执行的操作是合适的。但是后面的用法
#$previousPosition
将更典型地编写为一个简单的替换,
$previousPosition
。这是因为您通常希望那里的SQL参数由Slick正确转义。可能是这样的对整数没有影响,但对其他数据类型也有影响。

我开始明白为什么scala开发人员更喜欢原始sql而不是slick。
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){}
val q2 = query.filter(f=> f.authId === item.authId && f.position >= previousPosition && f.position <= item.position)