使用ibag完成多表查询的nhibernate应用

最近喜欢上了nhiberniate,虽然自己原本不是属于.net平台的开发人员。不过也接触过最近由于业务原因要开始.net的开发。虽然是给内部做点东西,所以可选择余地很大。。。

但是负责的将自己.net了解不多。。。于是乎看到了nhibernate架构。。不过这个架构也折腾了我很久。。因为的确速度有些慢。不过封装的很好。一点一点接触我又发现他对于多表查询貌似和hibernate,spring等有很多类似的地方。。。。不是很方便。不过我想既然都更新了这么多次版本应该有好的方法。。。

于是乎请教liyongji~~~哈哈博客园名人。。。

经过指点和实验,知道了nhibernate的一个应用就是idbag。这个在hibernate上面也应该有的,只是大家都不太清楚吧?
B

id  subid name
01  01    A1
01  02    A2
01  03    A3

A
id name
01 A

查询后

A  01 A1
A  02 A2
A  03 A3

我们的sql 可以是select name =(select name from A where id = a.id),id,name from B a

但是这对于nhibernate来讲可能就很麻烦了,因为这些架构应该都对于单表查询有很好的支持,多表类似上面的就有些问题。

看了很多资料都在说通过新建一个类实体来映射查询后的字段。。。不过这样的话不久违反了架构的本意么?

因此我觉得应该有这样的应用。

并且nhibernate源码也提供了这个测试用例。大家可以在test collectiontest文件夹内找到。

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="nhibernateTest2" namespace="NHibernate.Test.CollectionTest">
 <class name="A" table="a" lazy="false">
  <id name="Id" column="id" unsaved-value="null">
   <generator class="native" />
  </id>
  <property name="Name" column="aname" />
  <idbag name="Items" cascade="all-delete-orphan">
   <collection-id type="Int32" column="item_id">
    <generator class="increment" />
   </collection-id>
   <key column="a_id" />
   <element type="string" />
  </idbag>
 </class>
</hibernate-mapping>

对于他的实体类的定义如下

 

using System;
using System.Collections;

namespace NHibernate.Test.CollectionTest
{
 public class A
 {
  private int? _id;
  private string _name;
  private IList _items;----------------------定义了iList用来做什么呢?下面解答。

  public A() { }

  public int? Id
  {
   get { return _id; }
   set { _id = value; }
  }

  public string Name
  {
   get { return _name; }
   set { _name = value; }
  }

  public IList Items
  {
   get { return _items; }
   set { _items = value; }
  }

 }
}

 

经过试验我发现这个地方用来保存外键id对应的sub也就是B表的内容,不过很有意思的是我们的sql语句是从B表查询。但是在这给对方我们却看到我们得到的结果是通过A表来实现的。外键的作用就体现了出来,感觉就像找到了一个节点。。他下面的你都能找到了。。。

恩还可以。。。这就简单实现了多表查询结果的方法。不过我还在思考着会不会有别的问题呢???毕竟我们想从B表查询或者修改。。。他是从A表实现的。

 

主体就可以执行session. CreateCriteria(typeof(A)).List();就可以得到结果。

便利获取就可以,对于ITEMS这个field我们需要foreach遍历,自己是研究知道他的存储方式了。

顺便说一下,通过咨询和请教突然觉得hbm2dll这个工具很好。。根据实体映射文件反向生成数据库表~~~

 

转载于:https://www.cnblogs.com/lanyudidi/archive/2008/11/29/1343606.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值