From: Fabio M. (JIRA) <nh...@gm...> - 2011-05-02 14:09:47
|
[ http://216.121.112.228/browse/NH-1090?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Fabio Maulo resolved NH-1090. ----------------------------- Resolution: Fixed Fix Version/s: 3.2.0Alpha3 > Query cache does not work when using Criteria API to create a projection query with a result transformer > -------------------------------------------------------------------------------------------------------- > > Key: NH-1090 > URL: http://216.121.112.228/browse/NH-1090 > Project: NHibernate > Issue Type: Bug > Components: Core > Affects Versions: 1.2.0.GA, 1.2.1, 2.0.0.GA, 2.0.1.GA > Reporter: Olli Ryhänen > Priority: Major > Fix For: 3.2.0Alpha3 > > Attachments: NH1090-sideeffect.zip > > > Enabling query-cache on a projection query with a result transformer attached using Criteria API, will fail with an exception: > "System.InvalidCastException: Unable to cast object of type '<The output type from the result transformer' to type 'System.Object[]'" > The exception is caused by the line: > "cacheable.Add( TypeFactory.Disassemble( ( object[ ] ) result[ i ], returnTypes, session ) );" > in "NHibernate\Cache\StandardQueryCache.cs" on line 63, when it tries to cast the "result[i]" to an "object[]". > Using result transformers the result set has already been transformed to the transformed type, before adding to the cache, so casting to "object[]" will fail. (The transformation is done in the method "GetResultColumnOrRow" in CriteriaLoader.cs on line 74, which gets called in process of loading the result set from the database). > To reproduce the issue, turn on caching on any of the projection query tests with result transformer in "CriteriaQueryTests.cs". E.g. on line 494 > IList resultWithAliasedBean = s.CreateCriteria(typeof (Enrolment)) > .CreateAlias("Student", "st") > .CreateAlias("Course", "co") > .SetProjection(Projections.ProjectionList() > .Add(Projections.Property("st.Name"), "studentName") > .Add(Projections.Property("co.Description"), "courseDescription") > ) > .AddOrder(Order.Desc("studentName")) > .SetResultTransformer(Transformers.AliasToBean(typeof (StudentDTO))) > .SetCacheable(true) > .List(); > A simple fix would be to check if the type of "result[i]" is an "object[]" before adding to the cache and cache non "object[]" types as is to the cache (and do the same check when getting the items back from the cache), but I'm not sure if that would break the caching architecture in some way. -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://216.121.112.228/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira |