【问题标题】:create dynamic SQL with anorm使用异常创建动态 SQL
【发布时间】:2014-12-08 03:28:27
【问题描述】:

我不想删除并重新插入每一行,所以我使用以下方法尝试使用异常的多行:

SQL("""
            delete from PERSON_ROLES 
            WHERE person_id = {userId}
            and role_id not in ({rolescommastring})
            )
            """).on('userId -> userId,
                    'rolescommastring -> rolescommastring).execute()

上面产生了一个它不喜欢的字符串,我得到了:

c.j.b.PreparedStatementHandle - delete from PERSON_ROLES WHERE person_id = 1460 and role_id not in ( '1, 3, 8, 9' )

我可以用异常创建动态 sql 吗?

【问题讨论】:

    标签: scala playframework playframework-2.0 anorm


    【解决方案1】:

    自 Anorm 2.3 起,支持多值参数。

    SQL("""
            delete from PERSON_ROLES 
            WHERE person_id = {userId}
            and   role_id not in ({rolescommastring})
            )
            """).on('userId -> userId,
                    'rolescommastring -> Seq("id1", "id2", "id3")).execute()
    

    https://www.playframework.com/documentation/2.3.x/ScalaAnorm有更多类似的例子

    【讨论】:

      【解决方案2】:

      Anorm 不支持“IN”子句。大多数 ORM(如 scala-slick)都是一样的,因为准备好的语句不支持 IN 子句

      我使用的进程来自https://groups.google.com/forum/#!topic/play-framework/qls6dhhdayc/discussion

      基本上这样的事情应该可以工作

      val params = List(1, 3, 8, 9) 
      val paramsList = for ( i <- 0 until params.size ) yield ("role_id" + i)
      
      SQL("""
              delete from PERSON_ROLES 
              WHERE person_id = {userId}
              and   role_id not in ({%s})
              )
              """.format(paramsList.mkString("},{"))).on('userId -> userId ++ 
                      paramsList.zip(params)).execute()
      

      【讨论】:

      • 这对于整数来说可能没问题,但它不应该用作一般的解决方案,因为它已经成熟用于 SQL 注入。
      猜你喜欢
      • 1970-01-01
      • 2013-10-14
      • 1970-01-01
      • 2014-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-06
      相关资源
      最近更新 更多