2010-01-04 60 views
2

如果我有一個這樣的映射:HQL:查詢動態組件屬性

<class name="Library" table="Libraries"> 
    ... 
    <dynamic-component name="Annotations"> 
    <property name="LibraryResolver.AlgorithmVersion" column="`LibraryResolver.AlgorithmVersion`" type="Int32" /> 
    </dynamic-component> 
</class> 

我應該如何寫所有的圖書館,其中LibraryResolver.AlgorithmVersion大於給定值的HQL或LINQ到NHibernate的查詢?

回答

1

我不知道這是否有幫助,但是當我使用Criteria API(使用Java)它只是工作。雖然沒有嘗試過使用HQL。

<dynamic-component name="values"> 
     <property name="dynamicNameValue" column="ATTRIBUTE_1" type="string"/> 
     <property name="dynamicNumber" column="ATTRIBUTE_4" type="integer"/> 
</dynamic-component> 

Criteria criteria = session.createCriteria(DynamicAttributes.class) 
       .add(Expression.eq("values.dynamicNumber", 2)); 

只是一些想法:它可能是問題是,你傳遞的名稱(「LibraryResolver.AlgorithmVersion」)包含一個點?也許發佈一些你已經嘗試過的代碼?

+0

好的一個例子,我會稍晚發佈的代碼,但是我已經可以說,你是絕對正確關於這個名字。在這種情況下,不知道如何逃避或使用它。 Criteria API可以工作,但是這個查詢是從一個甚至沒有鏈接到NHibernate的庫發出的,我想離開它。 – 2010-03-01 14:18:24

2

下面也許沿線您正在尋找

from Library as lib 
where lib.Annotations.LibraryResolver.AlgorithmVersion > 2 

如果你正在使用NHibernate,你試過了NHibernate LambdaExtensions HQL查詢?這個庫在Criteria和DetachedCriteria apis上提供了一組擴展方法,當使用上面的兩個API進行查詢時,它刪除了魔術字符串的需要。

下面是一個可以如何使用NHibernate的獨立標準查詢與所提到的LambdaExtensions庫

Answer answerAlias = null; 
var actual = DetachedCriteria.For<Survey>() 
.Add<Survey>(s => s.Status == SurveyStatus.Complete) 
.Add<Questionnaire>(q => q.Id == questionnaireId) 
.CreateAlias<Survey>(s => s.Answers,() => answerAlias) 
.SetProjection(LambdaProjection.Property(() => answerAlias.Id)); 
+0

它工作嗎?我確定我嘗試過類似的查詢,並且它假設AlgorithmVersion是一個子屬性。不幸的是,我的系統中的.NET受到了損壞,這使我無法在剩餘的時間內嘗試此操作,直至獲得批准。 Lambda擴展看起來很有趣。我嘗試了Linq-to-Nhibernate,但它未能創建合理的查詢,但擴展似乎提供了更直接的方法來構建查詢。另一方面,我仍然不想從域名服務中引用NH。 – 2010-03-07 09:34:45

+0

我個人都使用過HQL和Criteria/Detached Criteria。我建議您嘗試一下Lambda擴展。它絕對幫助我在標準api上加快速度。 至於HQL語句的工作與否,這將是你必須嘗試的東西。但我很確定這將是一個很好的起點,從:)開始 – Noel 2010-03-07 13:43:58