NHibernate 之集合的映射与查询篇

来源:互联网 发布:vb 和校验 编辑:程序博客网 时间:2024/04/30 00:36

题记:

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, 是什么呢?

(原文链接 http://ddbiz.com/?p=146)