连接查询的二级缓存问题

时间:2011-09-06 08:24:58

标签: nhibernate fluent-nhibernate

我想使用二级缓存为我的查询提供热切加载(查询下面以3种不同方式编写,我使用查询缓存)。我有一对多标准的协会。我为父级和子级之间的父级,子级和关联设置了实体缓存。并且二级缓存不起作用,因为我有例外。

我用3种不同的方式写了我的查询:
标准:

 session.CreateCriteria<DictionaryMaster>().SetFetchMode("DictionaryItems", FetchMode.Eager)
                .SetResultTransformer(new DistinctRootEntityResultTransformer())
                .SetCacheable(true).SetCacheMode(CacheMode.Normal)
                    .List<DictionaryMaster>().ToList();

当我调用此查询时,我得到异常“无法执行查找[SQL:SQL not available]” 我认为问题存在,因为我使用DistinctRootEntityResultTransformer变换。我将开始创建我的自定义转换类,我希望它能工作。


查询:

 session.QueryOver<DictionaryMaster>().Fetch(x => x.DictionaryItems).Eager
                    .TransformUsing(new DistinctRootEntityResultTransformer())
                    .Cacheable().CacheMode(CacheMode.Normal)
                    .List<DictionaryMaster>().ToList();

例外情况与标准相同。

的LINQ:

session.Query<DictionaryMaster>().Fetch(x => x.DictionaryItems).Cacheable().CacheMode(CacheMode.Normal).ToList();

这里的错误取决于3.1中的nhibernate版本a得到了这个错误https://nhibernate.jira.com/browse/NH-2587?page=com.atlassian.jira.plugin.system.issuetabpanels%3Achangehistory-tabpanel 但在3.2版本中我得到了这个:https://nhibernate.jira.com/browse/NH-2856

提前致谢

1 个答案:

答案 0 :(得分:2)

sJHony我找到了解决方案,但对我来说更像是解决方法。因此,如果您知道任何其他解决方案,请给我签名 我利用QueryOver 没有任何转换,这个解决方案的错误在于查询返回的元素等于childs。接下来,我使用distinct检索内存中的乘法列表。
这个解决方案没问题,但是当我们再添加一个Fetch进行查询时,对象中的集合也会成倍增加,这就是我将集合类型从IList(Bag)修改为ISet(Set)的原因。

代码如下:

var queryCacheResult =
                session.QueryOver<DictionaryMaster>()
                .Fetch(x => x.DictionaryItems).Eager
                    .Cacheable().CacheMode(CacheMode.Normal)
                    .List<DictionaryMaster>().ToList();

            return queryCacheResult.Distinct(new KeyEqualityComparer<DictionaryMaster>(x => x.Code)).ToList();