Использование агрегатных функций Postgres с NHibernate

У меня есть следующий запрос:

SELECT title_id, title, array_agg(g.name)
FROM title t
INNER JOIN title_genre tg USING(title_id)
INNER JOIN genre g USING (genre_id)
GROUP BY title_id, title
ORDER BY title_id
LIMIT 10

Пример вывода этого запроса:

5527;"The Burbs";"{Suspense,"Dark Humor & Black Comedies",Comedy,"Cult Comedies"}"
5528;"20,000 Leagues Under the Sea";"{"Family Adventures","Children & Family","Ages 5-7","Book Characters","Family Animation"}"
5529;"2001: A Space Odyssey";"{"Classic Sci-Fi & Fantasy","Sci-Fi Thrillers",Classics}"
5530;"2010: The Year We Make Contact";"{"Sci-Fi Dramas","Alien Sci-Fi","Sci-Fi & Fantasy","Dramas Based on Contemporary Literature","Psychological Thrillers","Dramas Based on the Book"}"
5531;"The 39 Steps";"{"Dramas Based on the Book","United Kingdom",Thrillers,"Espionage Thrillers","Dramas Based on Classic Literature",Suspense}"
5532;"4D Man";"{"Classic Sci-Fi & Fantasy","Sci-Fi & Fantasy","Sci-Fi Horror"}"
5533;"8 Seconds";"{Drama,"Romantic Dramas",Biographies,"Indie Dramas","Sports Dramas","Miscellaneous Sports","Sports Stories","Other Sports"}"
5534;"9 1/2 Weeks";"{"Steamy Romance",Romance,"Romantic Dramas"}"
5535;"About Last Night...";"{"Romantic Dramas","Romantic Comedies",Romance}"
5536;"Above the Law";"{"Action & Adventure","Action Thrillers","Martial Arts"}"

(1) Как создать критерии NHibernate для функции array_agg? Нужно ли мне каким-либо образом расширять диалект PostgreSQL, чтобы приспособиться к этому?

(2) Я использую SQLite в качестве моей тестовой базы данных интеграции и PostgreSQL в качестве моей тестовой/производственной базы данных. В SQLite нет функции array_agg, но есть функция group_concat, которая делает нечто подобное. Можно ли что-то настроить, чтобы я мог использовать SQLite в своих тестах и ​​PostgreSQL в test/prod?

(3) array_agg возвращает данные в виде массива. Я нашел отличную статью на nhibernate.info, которая объясняет, как расширить NHibernate для обработки массивов PostgreSQL. Как включить это в мои критерии? Например, предположим, что я хочу найти название в жанре драмы, которое не является романтической драмой.

Заранее благодарю за любую помощь!


person csano    schedule 02.04.2011    source источник


Ответы (1)


(1) Как создать критерии NHibernate для функции array_agg? Нужно ли мне каким-либо образом расширять диалект PostgreSQL, чтобы приспособиться к этому?

Я не думаю, что вы должны. Предполагая, что вы хотите выбрать все заголовки по жанру, вам просто нужно предложение WHERE, которое преобразует жанр в его идентификационный номер. По одной причине подзапрос в столбце varchar может использовать индекс. По другой причине, я почти уверен, что, сделав это таким образом, ваш вопрос № 3 просто исчезнет.

SELECT title_id, title, array_agg(g.genre)
FROM title t
INNER JOIN title_genre tg USING(title_id)
INNER JOIN genre g USING (genre_id)
WHERE tg.title_id in (SELECT title_id 
                      FROM title_genre 
                      INNER JOIN genre ON genre.genre_id = title_genre.genre_id 
                                      AND genre.genre = 'Suspense'
                      )
GROUP BY title_id, title
ORDER BY title_id
LIMIT 10

Его также можно написать с использованием внутреннего соединения того же подзапроса.

SELECT t.title_id, t.title, array_agg(g.genre)
FROM title t
INNER JOIN title_genre tg USING(title_id)
INNER JOIN genre g USING (genre_id)
INNER JOIN (SELECT title_id 
            FROM title_genre 
            INNER JOIN genre ON genre.genre_id = title_genre.genre_id 
                            AND genre.genre = 'Suspense'
            ) gn
            ON gn.title_id = tg.title_id
GROUP BY t.title_id, t.title
ORDER BY t.title_id
LIMIT 10

(2) Можно ли что-то настроить, чтобы я мог использовать SQLite в своих тестах и ​​PostgreSQL в test/prod?

Возможно — и желательно — использовать в разработке ту же платформу, что и в производстве. Установите PostgreSQL и используйте его вместо SQLite.

person Mike Sherrill 'Cat Recall'    schedule 15.04.2011
comment
Я согласен: всегда используйте ту же среду для тестирования (и разработки), которую вы используете в производстве. - person a_horse_with_no_name; 15.04.2011