您的位置:首页 > 其它

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

2008-11-29 00:43 148 查看
最近喜欢上了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这个工具很好。。根据实体映射文件反向生成数据库表~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: