我有一个对象表和对象别名表。
别名只是字符串的集合:
object.Aliases
如果我像这样映射集合:
<class name="Object" table="Object" lazy="false">
...
properties...
...
<set name="Aliases" table="Aliases" inverse="true" lazy="false" fetch="join" >
<key column="ObjectId" />
<element column="Name" type="String"/>
</set>
...
</class>
然后session.CreateCriteria(typeof (T)).List<T>();
从基存储库获取所有对象,返回每个别名的副本。为什么?如何删除列表中重复的对象?
感谢大家的宝贵时间。
编辑:更新映射……这就是所有的映射。别名没有自己的类它只是一组字符串需要加载到ISet<string> Object.Aliases
当我开始使用NHibernate时,我也对此感到困惑。这就是它的工作原理。由于映射包含fetch="join"
,因此它在父表和子表之间使用SQL JOIN,因此父数据对于每个子表都是重复的。但是,不是过滤掉父类的额外实例,而是返回一个查询中每行有一个对象的集合。你需要表明你想要不同的对象。使用iccriteria语法,您可以将Transformers.DistinctRootEntity
添加到查询中。
参见使用Criteria API从NHibernate获取不同的结果集?
对于select n+1问题,将batch-size="10"
添加到映射
<set name="Aliases" batch-size="10" ...