hibernate 多对多关系及其关联查询
来源:互联网 发布:电工模拟软件 编辑:程序博客网 时间:2024/05/16 13:00
本节内容
- 多对多关系引入
- 多对多映射关系
- 多对多关联查询
- 1.原生SQL关联查询
- 2.HQL关联查询
- 3.Criteria API关联查询
- 结语
多对多关系引入
让我们再次回顾在第二篇中建立的数据模型:
在图上,我已经清晰的标注了表之间的关系,上两篇分析Customer和Order之间的“外键关系”或者称作“父子关系”、“一对多关系”和关联查询,这一篇以Order为中心,分析Order和Product之间的关系,直接看下面一幅图的两张表:
上面两张表关系表达的意思是:Order有多个Products,Product属于多个Orders。我们称Order和Product是多对多关系,这一篇我们来深入讨论在NHibernate如何映射多对多关系及其多对多关联查询。
多对多映射关系
1.Order有多个Products
有了上两篇的基础,现在直奔主题,建立关系。大家可以把这篇的代码作为模板,以后在工作中参考。
修改Order.cs类代码如下:
DomainModel.Entities{ { OrderId { ; ; } OrderDate { ; ; } Customer { ; ; } <> Products { ; ; } }}
修改Order.hbm.xml映射文件如下:
"" "" "" "" """" "" "" "" "" """" "" "" "" "" "" "" "" "" "" "" "" """" """" "" ""
在多对多关系中,其两方都使用Bag集合和many-to-many元素。看看上面各个属性和one-to-many,many-to-one属性差不多。
2.Product属于多个Orders
在项目DomainModel层的Entities文件夹中新建Product.cs类,编写代码如下:
DomainModel.Entities{ { ProductId { ; ; } Name { ; ; } Cost { ; ; } <> Orders { ; ; } }}
在项目DomainModel层的Mappings文件夹中新建Product.hbm.xml映射文件,编写代码如下:
"" "" "" "" """" """" "" "" """""" "" "" "" """" "" "" """" "" """" """" "" ""
多对多关联查询
使用NHibernate中提供的三种查询方法实现多对多关联查询,查询返回所有订单和产品的顾客列表。
1.原生SQL关联查询
<> UseSQL_GetCustomersWithOrdersHavingProduct(orderDate){ _session.CreateSQLQuery(+ + + ) .AddEntity(, ()) .SetDateTime(, orderDate) .List<>();}
这里需要使用Join告诉查询如何在表之间关联。无论多么复杂的关系,我们必须在查询语句中指定返回值。这里使用AddEntity设置返回的实体。
2.HQL关联查询
<> UseHQL_GetCustomersWithOrdersHavingProduct(orderDate){ _session.CreateQuery(+ ) .SetDateTime(, orderDate) .List<>();}
因为在映射文件已经定义实体之间一对多、多对多关系,NHibernate通过映射文件知道如何去关联这些实体,我们不需要在查询语句中重复定义。这里使用查询和上一篇使用HQL关联查询语句一样,NHibernate完全可以去关联对象,实现查询订单和产品。
3.Criteria API关联查询
因为实体之间的关联我们在映射文件中已经定义好了。所以我们在查询子对象使用子CreateCriteria语句关联对象之间导航,可以很容易地在实体之间指定约束。这里第二个CreateCriteria()返回ICriteria的新实例,并指向Orders实体的元素。第三个指向Products实体的元素。
<> UseCriteriaAPI_GetCustomerswithOrdersHavingProduct(){ _session.CreateCriteria(()) .Add(.Eq(,)) .CreateCriteria() .Add(.Gt(,(2008,10,1))) .CreateCriteria() .Add(.Eq(,)) .List<>();}
下面我用一幅图简单明了的说明这段代码神秘之处,也显示了一些约束条件。
编写一个测试用例测试UseCriteriaAPI_GetCustomerswithOrdersHavingProduct()方法,遍历列表,看看产品名称是否为“Cnblogs”,OK!测试通过。
[]UseCriteriaAPI_GetCustomerswithOrdersHavingProductTest(){ <> customers = _relation.UseCriteriaAPI_GetCustomerswithOrdersHavingProduct(); found = ; (c customers) { (o c.Orders) { (p o.Products) { (p.Name == ) { found = ; ; } } } } .IsTrue(found);}
下面再写个简单例子查询产品Id所关联的一些顾客,测试用例同上面差不多,自己修改下就可以啦。
<> UseCriteriaAPI_GetCustomerswithOrdersHavingProduct(productId){ _session.CreateCriteria(()) .CreateCriteria() .CreateCriteria() .Add(.Eq(, productId)) .List<>();}
结语
这一篇通过全盘代码的形式完成NHibernate中的多对多关系映射,使用NHibernate中提供的三种查询方法实现了多对多关联查询。希望对你有所帮助,多多练习。我们下次继续讨论NHibernate话题,像延迟加载、立即加载、对象状态等话题,关于朋友回复说讨论更多话题,我只能说,再等等吧,慢慢来,这才第十一篇,先把基础的问题弄清楚。
参考地址:http://www.verydemo.com/demo_c146_i33852.html
- hibernate 多对多关系及其关联查询
- hibernate 多对多关系及其关联查询
- MyBatis--关联关系查询--自关联--多对一--查询指定节点及其所有父节点
- Hibernate关联关系之一对多关联
- hibernate关联关系之多对多关系
- Hibernate -- 映射实体关联关系(多对多关联关系)
- Hibernate关联关系映射之一对多关联关系
- Hibernate关联关系映射之多对多关联关系
- Hibernate的多对多关联关系
- hibernate多对多关联关系
- Hibernate,多对多的关联关系
- Hibernate 映射多对多关联关系
- Hibernate 映射多对多关联关系
- Hibernate关联关系映射---多对多
- Hibernate映射多对多关联关系
- Hibernate的多对多关联关系
- Hibernate 映射多对多关联关系
- hibernate中的多对一关联关系
- 可以吗?从 FireWire 设备引导 Linux
- 单链表应用之多项式的操作_legend
- linux创建虚拟内存
- 安装mysql后,开启远程登录
- CCScrollView/CCTableViewCell(TableViewCell)
- hibernate 多对多关系及其关联查询
- php正则表达式 剔除字符串中的除了汉字的字符(只保留汉字)
- CCScrollView/CCTableView(CCTableViewDelegate CCTableViewDataSource CCTableView-滑动列表-游戏中大量使用 很重要的一个类)
- android的dalvik虚拟机
- QNAP最新系列产品 TS-219 NAS详细评测(15)
- Python 实例
- CCScrollView/CCSorting(。。)
- 关于雅虎 — 英文天气的API 解析
- Python和数据结构学习 --- 3