2015-09-03 51 views
0

我有這個需要重構的舊項目。 我開始使用最新版本的Nhibernate重寫一些查詢。 我有這個查詢,需要返回一個分頁的不同的ID列表的順序。 問題在於,您似乎無法通過未包含在select語句中的屬性進行排序。但我不想選擇其他列我只想要的ID。Nhibernate與訂單不同(Oracle DB)

有沒有辦法確保我只能得到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:沒有選定的表達。 有沒有人知道如何解決這個使用子查詢或其他東西? 我不習慣Nhibernate,所以我真的沒有線索。

回答

0

在標準SQL本身中,無法對select子句中不存在的列進行排序(按子句放置)。

請讓我知道爲什麼你需要在DatumInplanning上排序,當你只需要StudentId?如果需要,您還可以選擇使用原始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中沒有辦法可以做到這一點。如果按順序排列,您必須在選擇不同的子句時具有列名。這裏有替代品。

1)在結果中獲取兩列,並在應用程序中進行操作以獲取所需的確切數據。

2)更改爲自定義SQL,如下所示(子SQL)。我在Oracle中進行了測試。它運作良好。

select ID from (select ID from student order by Birthday); 

但是,在按條款的順序不在那裏的列上做不同的排序時,有業務結果問題。請參閱下圖。 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)不要放上獨特的條款,你應該能夠通過生日過濾它。

+0

對不起荷蘭語,我把DatumInplanning改爲BirthDay。 由於分頁,我需要訂單。這些ID用於另一個選擇,但我只選擇50每次,他們需要在確切的順序,因爲我想在屏幕上顯示它們。 – Beejee

+0

我已經通過編輯我的回答了。請檢查,讓我知道這是否解決您的問題 –

+0

我知道這個工程,但我們需要一個獨特的。 由於大量的表格被加入(進行一些過濾),結果中有重複。但是,一旦你達到一個獨特的,它將失敗,除非你使用子查詢,但我似乎無法弄清楚如何讓它在Nhibernate中工作。 – Beejee