Создать динамический 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?
2 ответа
Anorm не поддерживает предложения IN. То же самое для большинства ORM (например, scala- slick), поскольку подготовленные операторы не поддерживают предложения IN
Процесс, который я использую, происходит с https://groups.google.com/forum/
В принципе как то так должно работать
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()
Начиная с версии 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