создать динамический SQL с помощью anorm

я не хочу удалять и повторно вставлять каждую строку, поэтому я использовал следующее, чтобы попытаться использовать несколько строк с анормом:

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 с anorm?


person mbrambley    schedule 13.10.2014    source источник


Ответы (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()
person mohit    schedule 13.10.2014
comment
Это может быть нормально для целых чисел, но его не следует использовать в качестве общего решения, поскольку оно созрело для SQL-инъекций. - person Michael Zajac; 13.10.2014

Начиная с 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

person cchantep    schedule 13.10.2014