squeryl: ошибка при обновлении столбца с объединенной строкой

Я пытаюсь использовать squeryl и обновить столбец с другим значением, соединенным со строкой. Итак, сначала я попробовал это (упрощенный / надуманный пример):

update(songs)(s =>
where(s.name isNull)
set(s.year_str := Some(s.default_year + " AD"))

Это приводит к запросу:

update `songs` set
`year_str` = (`songs`.`default_year`)
Where `songs`.`name` is null

Обратите внимание, что конкатенация исчезла!

Я прочитал документацию и попробовал с:

update(songs)(s =>
where(s.name isNull)
set(s.year_str := Some(&(s.default_year || " AD")))

это привело к исключению NullPointerException

Caused by: java.lang.NullPointerException: null
at org.squeryl.internals.FieldReferenceLinker$.pushExpressionOrCollectValue(FieldReferenceLinker.scala:36) ~[squeryl_2.10-0.9.6-M1.jar:0.9.6-M1]
at org.squeryl.dsl.QueryDsl$class.$amp(QueryDsl.scala:204) ~[squeryl_2.10-0.9.6-M1.jar:0.9.6-M1]
...

Какой самый простой способ создать следующий запрос:

update `songs` set
`year_str` = concat(`songs`.`default_year`, 'AD')
Where `songs`.`name` is null

1 ответ

Решение

Вам нужно использовать оператор.~, Чтобы преобразовать поле "s.default_year" в узел AST, попробуйте это:

update(songs)(s =>
  where(s.name isNull)
  set(s.year_str := s.default_year.~ || " AD")
)

Если вы используете версию Squeryl до 0.9.6, вам, возможно, придется сделать это вместо этого:

set(s.year_str := s.default_year.~ || Some(" AD"))
Другие вопросы по тегам