【问题标题】:fetch=join to tables to one class NHibernatefetch=join 到一个类 NHibernate 的表
【发布时间】:2009-10-09 12:03:24
【问题描述】:

我读过一些关于 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”一样。

这样好吗? 有没有办法直接从映射为&lt;many-to-one&gt; 的类中获取属性? (不是 AttrName.Name,而只是 Name )

解释:

上面设置的部分映射没有显示我真正的问题。 我想将某个实体映射为IDictionary&lt;string,AttributeValue&gt;。 我将其映射为

<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>

【问题讨论】:

    标签: nhibernate join fetch


    【解决方案1】:

    这并没有做你认为它正在做的事情。使用 fetch=join 只是为了急切加载关系的多方面。在这两种情况下,您最终都会返回相同的对象。默认情况下,NHibernate 将延迟加载相关实体(这就是您获得第二个查询的原因)。通过使用 fetch=join,您会立即请求整个对象关系,但它仍会像不使用 fetch=join 一样填充对象。

    【讨论】:

      【解决方案2】:

      这不是你描述的方式。您的实体不会根据您的要求而改变。

      您将获得主要实体的实例列表,并获取与另一个实体的关联。因此,如果在您的代码中访问关联,您将找到值。

      如果您不获取它,您将无法访问这些字段,因为它们不会从数据库中检索到。

      【讨论】:

      • 我知道您的映射对于常规 Hibernate 不正确,我不确定 NHibernate。我没有看到您的关联...抱歉,我现在没有测试环境来帮助您:-(
      【解决方案3】:

      我不明白你的问题。 'fetch-join' 属性只定义了 NHibernate 生成的用于检索类实例的 sql 的外观。 它与将返回的“什么”无关。 NHibernate 会将记录集(即查询的结果)转换为正确的类实例。

      如果您只想检索实体的某些部分(例如名称),那么您必须编写 HQL 查询,或者使用 ICriteria API 并可能使用投影。

      【讨论】:

      • 你们提供在哪里使用 HQL?在映射?我只想通过映射来修复这个项目,这就是 ICriteria API 和投影不适合的原因。
      • 然后,您必须创建仅包含您感兴趣的属性的新类,并将该类映射到表。但是,我不会推荐这种方法。为什么不使用 hql 或 icriteria ?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多