NHibernate HQL отличается и упорядочивается по

#nhibernate #hql

#nhibernate #hql

Вопрос:

Я недавно обновил 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, чтобы получить отличные результаты?

Комментарии:

1. Не спешите переходить с HQL на любой другой метод доступа, мы также используем NHibernate 3 и планируем в конечном итоге перевести все наши другие методы доступа на HQL, поскольку SQL, генерируемый другими методами доступа, неэффективен.

Ответ №1:

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

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

Ответ №2:

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

Попробуйте

выберите distinct c.OwnerUser, c.OwnerUser.UserName из фильма c order by c.OwnerUser.UserName

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

Комментарии:

1. Спасибо, но мне нужно вернуть OwnerUsers непосредственно из запроса из-за того, как работает созданная платформа.

2. даже если я использую это решение, результат больше не отличается от того, что мне было нужно

Ответ №3:

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

 select c.OwnerUser from Film c where c.OwnerUser.id in ( select distinct c.OwnerUser.id from Film c) order by c.OwnerUser.UserName