2010-07-08 63 views
3

我有以下NHibernate的查詢,結果就是DTO的,沒有實體的名單:SetCacheable拋出IndexOutOfBoundsException異常

var result = query 
       //.SetCacheable(true) 
       .SetResultTransformer(new MyDTOTransformer()) 
       .List<DTO>(); 

這適用於SetCacheable中發表評論,但它拋出當我設置SetCacheable爲true IndexOutOfBoundsException異常。

這是堆棧跟蹤:

at NHibernate.Type.TypeFactory.Disassemble(Object[] row, ICacheAssembler[] types, Boolean[] nonCacheable, ISessionImplementor session, Object owner) 
    at NHibernate.Cache.StandardQueryCache.Put(QueryKey key, ICacheAssembler[] returnTypes, IList result, Boolean isNaturalKeyLookup, ISessionImplementor session) 
    at NHibernate.Loader.Loader.PutResultInQueryCache(ISessionImplementor session, QueryParameters queryParameters, IType[] resultTypes, IQueryCache queryCache, QueryKey key, IList result) 
    at NHibernate.Loader.Loader.ListUsingQueryCache(ISessionImplementor session, QueryParameters queryParameters, ISet`1 querySpaces, IType[] resultTypes) 
    at NHibernate.Loader.Loader.List(ISessionImplementor session, QueryParameters queryParameters, ISet`1 querySpaces, IType[] resultTypes) 
    at NHibernate.Loader.Custom.CustomLoader.List(ISessionImplementor session, QueryParameters queryParameters) 
    at NHibernate.Impl.SessionImpl.ListCustomQuery(ICustomQuery customQuery, QueryParameters queryParameters, IList results) 
    at NHibernate.Impl.SessionImpl.List(NativeSQLQuerySpecification spec, QueryParameters queryParameters, IList results) 
    at NHibernate.Impl.SessionImpl.List[T](NativeSQLQuerySpecification spec, QueryParameters queryParameters) 
    at NHibernate.Impl.SqlQueryImpl.List[T]() 
    at ... 

誰能幫助我,說我該怎麼解決這個問題(或者即使這是在NHibernate的支持)?

我目前正在使用NHibernate-version 2.1.0.4000。

謝謝 耶勒

+0

您是否在您的配置中啓用了查詢緩存? – AlexCuse 2010-07-08 11:43:14

+0

我已經將use-query-cache設置爲true(使用fluent-nhibernate)。但我沒有指定二級緩存提供程序。我只是想知道我的命名查詢的結果在會話期間被緩存了。 – Jelle 2010-07-08 12:27:44

回答

1

我可能是錯的,但我認爲,查詢緩存依賴於要啓用的二級緩存。說實話,我想知道在二級緩存中沒有實體緩存是否會有用,因爲它存儲的所有內容都是與給定查詢/參數組合關聯的ID列表(您仍然需要轉到數據庫來實際獲取對象,並且在某些情況下,這可能會導致每個對象有1個查詢)。

This是緩存在NHibernate的,我已經看到了更好的職位之一,它似乎對你只能在二級緩存

0

緩存查詢我有同樣的異常最終建議,現在已經修復了。昨天當我通過爲我的實體設置SetCacheable來使用第二個緩存時,發生了IndexOutOfBoundsException

我用谷歌搜索它,發現一個博客提到它可能是我的客戶實體的問題。我試過query.setCacheable(true);,並添加了query.setCacheMode(CacheMode.GET);,它工作!試試這個解決方案。

0

我認爲你只需要使用AddScalar來「聲明」你從DTO返回的列。如果沒有下面的AddScalar行(結果集中的每個列都有一行),則不存在第二級高速緩存代碼所需的列定義元數據(因此索引超出範圍異常)

只需使用AddScalar列出所有正在退回的列,我敢打賭它的工作原理。

var result = query 
      //.SetCacheable(true) 
      .AddScalar("yourfirstcolumn",NHibernateUtil.Int32) 
      .AddScalar("yoursecondcolumn",NHibernateUtil.String) 
      .SetResultTransformer(new MyDTOTransformer()) 
      .List<DTO>();