SetCacheable выбрасывает IndexOutOfBoundsException - PullRequest
3 голосов
/ 08 июля 2010

У меня есть следующий запрос в NHibernate, где результатом является список DTO, а не сущностей:

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

Это работает с SetCacheable в комментарии, но выдает исключение IndexOutOfBoundsException, когда я устанавливаю SetCacheable в true.

Это трассировка стека:

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-версию 2.1.0.4000.

Спасибо, Джелль

Ответы [ 3 ]

1 голос
/ 09 июля 2010

Возможно, я ошибаюсь, но я думаю, что кеш запросов зависит от того, включен ли кеш второго уровня. Если честно, мне интересно, было бы все это полезно без кэширования сущностей в кэше второго уровня, потому что все, что он хранит, это список идентификаторов, связанных с данной комбинацией запроса / параметра (вам все равно нужно перейти к база данных для фактического получения объектов, и в некоторых ситуациях это может привести к 1 запросу на объект).

Этот - один из лучших постов о кешировании в nhibernate, который я когда-либо видел, и, похоже, ближе к концу мы можем только кешировать запросы в кэше второго уровня

0 голосов
/ 24 июня 2014

Я думаю, что вам просто нужно "объявить" свои столбцы, которые вы возвращаете из своего DTO, используя AddScalar.Без приведенных ниже строк AddScalar (по одной для каждого из столбцов в наборе результатов) нет метаданных определения столбца, в которых нуждается код кэша второго уровня (и, следовательно, исключение индекса вне границ)

Простоиспользуйте AddScalar, чтобы получить список всех возвращаемых столбцов, и я уверен, что это сработает.

var result = query
            //.SetCacheable(true)
            .AddScalar("yourfirstcolumn",NHibernateUtil.Int32)
            .AddScalar("yoursecondcolumn",NHibernateUtil.String)
            .SetResultTransformer(new MyDTOTransformer())
            .List<DTO>();
0 голосов
/ 23 марта 2013

У меня было то же исключение, и оно исправлено. Вчера, когда я использовал второй кеш, установив для своей сущности SetCacheable, произошел IndexOutOfBoundsException.

Я гуглил и нашел блог, в котором упоминалось, что это может быть проблема с моей Клиентом Я попробовал query.setCacheable(true);, и добавил query.setCacheMode(CacheMode.GET);, и это сработало! Попробуйте это решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...