2013-05-15 68 views
2

所以這在我看來似乎有些複雜,所以我會嘗試儘可能清楚地設置場景。在單個查詢中查詢基類和派生類

[ActiveRecord, JoinedBase] 
abstract BaseClass 
{ 
    public x; 
    public y; 
} 

[ActiveRecord, JoinedBase] 
ClassA : BaseClass { } 

[ActiveRecord, JoinedBase] 
ClassB : BaseClass { } 

abstract GraphicBaseClass : BaseClass 
{ 
    public height; 
    public width; 
} 

[ActiveRecord, JoinedBase] 
ClassC : GraphicBaseClass { } 

[ActiveRecord, JoinedBase] 
ClassD : GraphicBaseClass { } 

[ActiveRecord, JoinedBase] 
ClassE : GraphicBaseClass { } 

注:幾個關鍵字和其他絨毛忽略保存的文本,我需要進入的牆。

因此,我們有一個標準的基類「BaseClass」,它實現了一些屬性的文本解釋。然後,我們有幾個類「ClassA」和「ClassB」,它們是基類的特定類型。然後,我們使用一箇中間基類「GraphicBaseClass」,它添加了其餘3個類繼承的高度和寬度屬性。這將導致單個BaseClass公用表以及每個具體類的5個特定表。

我有一個查詢,在大多數作品的基本屬性。在某些情況下,我想查詢高度和寬度。由於GraphicBaseClass不是一個activerecord類,我不能用它作爲查詢的基礎。目前我正在使用QueryOver語法,但我找不到使用高度和寬度屬性查詢三個GraphicBaseClass派生實體的方法。

我到目前爲止最接近的是:

QueryOver<BaseClass, BaseClass> query = QueryOver.Of<BaseClass>() 
    .Where(bc => bc.x == something) 
    .TransformUsing(CriteriaSpecification.DistinctRootEntity); 
if (actualTypes.All(x => x.IsSubclassOf(typeof (GraphicBaseClass)))) 
{ 
    // Filter by dimensions 
    if (criteria.RestrictSize) 
    { 
     if (criteria.FilterByDimension) 
     { 
      query.DetachedCriteria.Add(Restrictions.Lt("Width", criteria.Width + 10)); 
      query.DetachedCriteria.Add(Restrictions.Lt("Height", criteria.Height + 10)); 
     } 
    } 
} 

這導致SQL是這樣的:

SELECT TOP (4 /* @p0 */) this_.BaseClassId as BaseClass1_97_5_, 
       this_.Version     as Version97_5_, 
       this_.BaseClassType   as BaseClass2_97_5_, 
       this_1_.Width     as Width99_5_, 
       this_1_.Height     as Height99_5_, 
       this_2_.Width     as Width100_5_, 
       this_2_.Height     as Height100_5_, 
       this_3_.X      as X101_5_, 
       this_4_.Width     as Width102_5_, 
       this_4_.Height     as Height102_5_, 
       this_5_.X      as X103_5_, 
FROM BaseClass this_ 
     left outer join ClassC this_1_ 
     on this_.BaseClassId = this_1_.ClassCId 
     left outer join ClassD this_2_ 
     on this_.BaseClassId = this_2_.ClassDId 
     left outer join ClassA this_3_ 
     on this_.BaseClassId = this_3_.ClassAId 
     left outer join ClassE this_4_ 
     on this_.BaseClassId = this_4_.ClassEId 
     left outer join ClassB this_5_ 
     on this_.BaseClassId = this_5_.ClassBId 
WHERE and this_1_.Width between 0 /* @p8 */ and 'Height' /* @p9 */ 

所以才申請的高度和寬度限制到3個所需的類之一。

我在這裏尋找任何答案,如果它可以在HQL或Criteria API或任何需要實現結果。

道歉的文本牆!

謝謝。

回答

2

有點晚了,我知道。這裏是我通常使用的解決方案:

創建一個子查詢並用「in」加入。

if (/* subclass required*/) 
{ 
    var subClassQuery = QueryOver.Of<GraphicBaseClass>(); 
    subClassQuery.Where(x => x.Width == criteria.Width); 
    subClassQuery.Where(x => x.Height == criteria.Height); 
    subClassQuery.Select(x => x.Id); 
    query.Where(Subquery.WherePropery(x => x.Id).In(subClassQuery)); 
} 
+0

似乎只是公平的您應得的答案,因爲你是第一人,在3年內嘗試:d我假設它的作品,因爲我還沒有在近3年的感動的ActiveRecord:d – Adam