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,所以我真的不知道

Nhibernate Distinct with Order By (Oracle DB)

在标准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

3)不要放不同的子句,你应该能够过滤它的生日