题记:
NHibernate: 2.1.2.4000
.net : > fx 2.0
(原文链接 http://ddbiz.com/?p=146)
NHibernate的<map /> 集合映射 可以使用 System.Collections.Generic.IDictionary<TKey, TValue> 来映射。map映射的几个主要部分包括:
集合外键: <map ...> <key column="???" />...</map>
通过 <key column="???" /> 来表明对象关系
索引字段: <map ...> <key ... /> <map-key .../> ...</map>
对应 IDictionary<TKey ...>, 可以使用
值类型 : <map-key /> 或者 <composite-map-key />
引用类型: <map-key-many-to-many />
集合元素: <map ...> <key ... /> <map-key .../> <element ... /> ... </map>
对应 IDictionary<TKey, TValue>, 可以使用
值类型 : <element /> 或 <composite-element />
应用类型: <one-to-many /> 或 <many-to-many /> 等。
【以上内容感谢 李老师文章】
集合元素的查询常用的函数包括:
index()
indiecs()
elements()
maxindex()
minindex()
minelement()
maxelement()
size()
以及 限定词
some, all, exists, any, in
接下来我们通过一个例子来展示查询和相对应的SQL语句是怎样的。
映射文件: msgnotice.hbm.xml
类文件: msgnotice.cs
类文件中的几个属性,有些是 enum定义,此处就省略了定义,读者可以自行填补,如 TMsgNoticeWayType, TMsgNoticeType等。
应用说明: msgnotice 是用来保存一些信息,而这些信息是可以根据定义的 TMsgNoticeWayType的方式,通过不同的渠道发送给接收者,如 SMS短信、及时通信工具、邮件等的。
那么如果我们要查询当前系统中需要发送的邮件信息,如: MsgNoticeList(TMsgNoticeWayType.Email),查询改怎么做呢?
为了使查询结果也能结构化定义,我们另外定义了一个临时类,用于储存MsgNoticeList的返回结果:
如下的查询如:
这个查询生成的SQL语句:
很显然,这不是我们要的结果,而且这个查询的效率可以说十分低下。我们换一种方式看看:
这个查询生成的SQL是这样的:
很好,这才是我们需要的结果:直接通过 noticeways1_.way 来限定我们要的内容。
index(a) 还可以 使用如:
index(a) in (:way1, :way2) 这种方式,生成的SQL语句也就是
where noticeways1_.way in (:way1, :way2)
总结:
index 是从 key 中选择符合条件的key,
indices, 是什么呢?