我已阅读一些关于fetch = join - http://nhforge.org/blogs/nhibernate/archive/2009/04/09/nhibernate-mapping-lt-many-to-one-gt.aspx的帖子(ser4ik.livejournal.com/2505.html) 所以我有一些问题,例如我有课
<class name="AttributesInf" table="attr_inf">
<id name="Id">
<generator class="identity"/>
</id>
<property name="Name" />
<property name="Desc"/>
</class>
和
<class name="AttributeValue" table="attr_val">
<id name="Id">
<generator class="identity"/>
</id>
<property name="Value" />
<many-to-one name="AttrName" column="attrId"/>
</class>
如果我在没有set fetch =“join”的情况下使用此映射,我会得到sql:
Select av.Id, av.Value, av.attrId From attr_val av where av.Id=...()
然后单独的SQL查询,如:
Select * From attr_inf where Id = av.attrId
所以我的结果是:
class AttrinuteInf
{
int Id;
string Name;
string Desc;
}
class AttributeValue
{
int Id;
string Value;
AttributeInf AttrName;
}
如果我设置了fetch =“join”,那么我会得到一个查询:
Select u.Id, u.UserName, u.BlogId, b.Id, b.BlogName, b.BlogAuthor, b.BlogMsg
from Users u
Left outer join Blogs b
On u.BlogId=b.Id
Where u.Id = ...
所以我希望得到一个班级:
class AttributeValue
{
int Id;
string Value;
string Name;
string Desc;
}
但是我有相同的结果,好像我没有将fetch设置为“join”。
这样可以吗?
有没有办法直接从{maper类} <many-to-one>
获取属性?
(不是AttrName.Name,而只是名称)
说明:
上面的映射集部分没有显示我的真正问题。
我想将某个实体映射为IDictionary<string,AttributeValue>
。
我把它映射为
<map name="Attributes" table="attr_val" lazy="true" cascade="all-delete-orphan" inverse="true">
<key column="item_id"></key>
<index column="name"></index> //I don't have that item in class AttributeValue, that is why I try to get it from other table
<one-to-many class="AttributeValue"/>
</map>
答案 0 :(得分:7)
这不是你认为它正在做的事情。使用fetch = join就是急切加载关系的多方面。在这两种情况下,您最终都会返回相同的对象。默认情况下,NHibernate将延迟加载相关实体(这就是为什么你得到第二个查询)。通过使用fetch = join,您可以立即请求整个对象关系,但它仍然会在没有fetch = join的情况下填充对象。
答案 1 :(得分:1)
这不是你描述它的方式。您的实体不会根据您的要求而改变。
您将获得主实体的实例列表,并获取与另一个实体的关联。因此,如果在您的代码中访问该关联,您将找到这些值。
如果您不提取它,您将无法访问这些字段,因为它们不会从数据库中检索到。
答案 2 :(得分:1)
我不明白你的问题。 'fetch-join'属性只定义了NHibernate生成的用于检索类实例的sql的样子。 它与“什么”将被退回无关。 NHibernate将翻译记录集(即查询的结果)来纠正类的实例。
如果您只想检索实体的某些部分(例如名称),那么您必须编写HQL查询,或者使用ICriteria API并使用投影。