|
From: NHibernate J. <mik...@us...> - 2007-08-10 08:11:06
|
Query cache does not work when using Criteria API to create a projection qu=
ery with a result transformer
---------------------------------------------------------------------------=
-----------------------------
Key: NH-1090
URL: http://jira.nhibernate.org/browse/NH-1090
Project: NHibernate
Issue Type: Bug
Components: Core
Affects Versions: 1.2.0.GA, 2.0.0.Alpha1, LATER
Reporter: Olli Ryh=C3=A4nen
Priority: Major
Enabling query-cache on a projection query with a result transformer attach=
ed using Criteria API, will fail with an exception:
"System.InvalidCastException: Unable to cast object of type '<The output ty=
pe from the result transformer' to type 'System.Object[]'"
The exception is caused by the line:
"cacheable.Add( TypeFactory.Disassemble( ( object[ ] ) result[ i ], returnT=
ypes, session ) );"
in "NHibernate\Cache\StandardQueryCache.cs" on line 63, when it tries to ca=
st the "result[i]" to an "object[]".
Using result transformers the result set has already been transformed to th=
e transformed type, before adding to the cache, so casting to "object[]" wi=
ll fail. (The transformation is done in the method "GetResultColumnOrRow" i=
n 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 test=
s with result transformer in "CriteriaQueryTests.cs". E.g. on line 494
IList resultWithAliasedBean =3D 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 cach=
e (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.=20
--=20
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: htt=
p://jira.nhibernate.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
|