NHibernate HQL различен и упорядочен по - PullRequest
2 голосов
/ 17 мая 2011

Я недавно обновил NHibernate 1.2 до 3.1 в старой кодовой базе. Я исправил большинство проблем, но я застрял на этом. (Я не могу перейти с HQL на другой метод доступа без большого количества изменений в кодовой базе).

Это не было проблемой в 1.2, но после обновления я получаю следующую проблему.

У меня есть следующий HQL:

select distinct c.OwnerUser from Film c order by c.OwnerUser.UserName

, что приводит к ошибке:

[SQL: select distinct user1_.Id as Id33_, user1_.ApplicationId as Applicat2_33_, user1_.UserName as UserName33_, user1_.LoweredUserName as LoweredU4_33_, user1_.MobileAlias as MobileAl5_33_, user1_.IsAnonymous as IsAnonym6_33_, user1_.LastActivityDate as LastActi7_33_, user1_.CreateDate as CreateDate33_, user1_.CountryCode as CountryC9_33_, user1_.PreferredEditionId as Preferr10_33_ from dbo.tbl_Content film0_ inner join dbo.vw_aspnet_Users_With_Id user1_ on film0_.OwnerUserId=user1_.Id, dbo.vw_aspnet_Users_With_Id user2_ where film0_.discriminator in ('film', 'webcamfilm', 'slideshow') and film0_.OwnerUserId=user2_.Id order by user2_.UserName] ---> System.Data.SqlClient.SqlException: ORDER BY items must appear in the select list if SELECT DISTINCT is specified.

Этот код работает нормально, просто с дублирующейся записью, которую я не хочу.

select c.OwnerUser from Film c order by c.OwnerUser.UserName

Как мне написать HQL, чтобы получить отчетливые результаты?

Ответы [ 3 ]

2 голосов
/ 17 мая 2011

Попробуйте указать соединение

select distinct owner from Film c join c.OwnerUser owner order by owner.UserName
0 голосов
/ 03 апреля 2015

Предполагая, что пользователь-владелец имеет уникальный идентификатор, вы можете использовать следующее:

select c.OwnerUser from Film c where c.OwnerUser.id in ( select distinct c.OwnerUser.id from Film c) order by c.OwnerUser.UserName
0 голосов
/ 17 мая 2011

Ошибка в этом sql - это предложение order by user2_.UserName, но user2_.UserName не может быть найден в списке выбора, что является ограничением для выбора отдельного запроса.

Попробуйте

выбрать отдельный c.OwnerUser, c.OwnerUser.UserName из фильма c заказ от c.OwnerUser.UserName

затем выполните итерацию по результирующему списку и получите OwnerUser как (OwnerUser) list [i] [0] или аналогичный

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...