Существует ли какая-то структура реляционной базы данных scala (anorm, squeryl и т. д.), использующая агрегаторы, подобные postgres, для создания списков после группировки или, по крайней мере, имитации ее использования?
Я бы ожидал двух уровней реализации:
«стандартный», где по крайней мере любая группировка SQL с array_agg транслируется в список того типа, который агрегируется,
и "Scala ORM", где разрешен некоторый тип соединения, так что, если агрегация является внешним ключом для другой таблицы, создается список элементов другой таблицы. Конечно, эта последняя вещь находится за пределами досягаемости SQL, но если я использую более мощный язык, я не возражаю против некоторых стероидов.
Я нахожу особенно интригующим тот факт, что документация slick, основанная именно на разрешении нотации scala group-by, по-видимому, явно отрицает вывод списков в результате группировки.
РЕДАКТИРОВАТЬ: вариант использования
У вас есть типичная таблица «многие ко многим», скажем, для продуктов и поставщиков, пар (p_id, s_id). Вы хотите создать список поставщиков для каждого продукта. Таким образом, запрос postgresql должен быть
SELECT p_id, array_agg(s_id) from t1 group by p_id
Можно было бы ожидать какого-то идиоматического способа сделать это в slick, но я не понимаю, как это сделать. Кроме того, если мы перейдем к какой-либо ORM, то мы могли бы также рассмотреть соединение с таблицами products и Suppliers, по p_id и s_id соответственно, и получить в качестве ответа zip (product, (supplier1, supplier2, supplierN)), содержащий объекты и не только идентификаторы
array_agg
имеет типArray
в JDBC, поэтому с помощью Anorm вы можете анализировать такой столбец какArray[T]
илиList[T]
при условии, что каждое значение массива имеет поддерживаемый тип, который может быть проанализирован какT
. У Slick должно быть что-то похожее с собственным запросом. - person cchantep   schedule 19.01.2015