我想使用二级缓存为我的查询提供热切加载(查询下面以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
提前致谢
答案 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();