SetCacheable抛出IndexOutOfBoundsException

时间:2010-07-08 11:37:31

标签: nhibernate fluent-nhibernate

我在NHibernate中有以下查询,其结果是DTO的列表,而不是实体:

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。

谢谢你, 耶勒

3 个答案:

答案 0 :(得分:1)

我可能错了,但我认为查询缓存依赖于启用的二级缓存。说实话,我想知道如果没有实体缓存在二级缓存中是否会有用,因为它存储的所有内容都是与给定查询/参数组合相关联的ID列表(您仍然需要转到数据库实际上获取对象,在某些情况下,这可能导致每个对象1次查询。

This是我见过的关于nhibernate缓存的更好帖子之一,它似乎建议最后你只能在二级缓存中缓存查询

答案 1 :(得分:0)

我有同样的例外,现在已修复。昨天,当我通过为我的实体设置SetCacheable时使用了第二个缓存时,发生了IndexOutOfBoundsException

我用Google搜索并发现一个博客,提到它可能是我的客户实体的问题。我尝试了query.setCacheable(true);,并添加了query.setCacheMode(CacheMode.GET);并且它有效!试试这个解决方案。

答案 2 :(得分:0)

我认为您只需要使用AddScalar“声明”您从DTO返回的列。如果没有下面的AddScalar行(结果集中的每一列都有一行),则没有第二级缓存代码需要的列定义元数据(因此索引超出范围异常)

只需使用AddScalar列出所有要返回的列,我敢打赌它可以正常工作。

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