Nhibernate Distinct with Order By (Oracle DB)
本文关键字:Oracle DB By Distinct with Order Nhibernate | 更新日期: 2023-09-27 18:11:02
我有一个需要重构的老项目。我开始使用最新版本的Nhibernate重写一些查询。我有这个查询,需要返回一个有顺序的Id的分页不同列表。问题是,您似乎无法对未包含在select语句中的属性进行排序。但是我不想选择其他列,我只想要id。
是否有一种方法来确保我只得到Id,仍然得到一个不同的页面列表?
这是我现在的简化版本:
Student student = null;
Locker locker = null;
Teacher teacher = null;
Grade grade = null;
var baseQuery = SessionHandler.CurrentSession.QueryOver(() => student)
.JoinAlias(() => cat.Locker, () => locker)
.JoinAlias(() => cat.Teachers, () => teacher)
.JoinAlias(() => cat.Grades, () => grade));
if (gender.HasValue)
{
baseQuery.Where(() => student.Gender == gender.Value);
}
if (hallway.HasValue)
{
baseQuery.Where(() => locker.Hallway == hallway.Value);
}
...
baseQuery.Select(Projections.Distinct(Projections.Property(() => student.StudentId)));
baseQuery.OrderBy(b => student.Birthday, OrderSettings.Direction);
var results = baseQuery.Skip(50).Take(50).List<TKey>();
这样的代码总是抛出ORA-01791: not a SELECTed表达式。有人知道如何使用子查询或其他东西来解决这个问题吗?我不习惯Nhibernate,所以我真的不知道
在标准SQL中,你不能对不在select子句中的列进行排序(按子句排序)。
请告诉我,当你只需要StudentId时,为什么你需要对DatumInplanning进行排序?如果需要,还可以选择使用原始SQL语法。
var query = "SELECT TOP 10000 o.* "
+ " from ORDERS o where o.Year in (:orderYear));";
var session = sessionFactory.OpenSession();
var result =session.CreateSQLQuery(query)
.AddEntity(typeof(Order))
.SetInt32("orderYear",2012)
.List<Order>();
在SQL中没有办法做到这一点。如果按顺序排列,必须在select distinct子句中有列名。
1)获取结果中的两列,并在应用程序中进行操作以获得所需的确切数据。
2)更改为自定义SQL,如下所示(子SQL)。我在Oracle中对此进行了测试。
select ID from (select ID from student order by Birthday);
但是,当您对不在order by子句中的列进行不同排序时,会出现业务结果问题。请看下面的插图。ID 2属于出生日期4,6,8。因此,当您按出生日期排序时,并获得不同的ID,结果将不一致。给我你的表结构和你想要获取的结果。如果我能从SQL方面解决这个问题,让我给机会。
SQL> select id,birthdate from student order by birthdate;
ID BIRTHDATE
---------- ---------
0 29-AUG-15
5 29-AUG-15
1 03-SEP-15
2 04-SEP-15
3 06-SEP-15
2 06-SEP-15
2 08-SEP-15
7 rows selected.
SQL> select distinct id from (select id,birthdate from student order by birthdat
e);
ID
----------
1
2
5
3
0