【问题标题】:NHibernate inner join master-detail on a column other than the idNHibernate 内部连接主从除 id 以外的列
【发布时间】:2009-07-15 15:37:12
【问题描述】:

假设以下映射条目:

<id name="InternalId" column="uintCustomerId" type="long">
  <generator class="identity" />
</id>

<!-- The BinaryBlob below is a 16 byte array - Think Guid.NewGuid().ToByteArray -->
<property name="CustomerUid" column="uidCustomerId" type="BinaryBlob" not-null="true" /> 
<property name="Name" column="strFullName" type="String" not-null="true" />
<property name="Age" column="intAge" type="System.Int32" not-null="true" />

<set name="Orders" table="order" generic="true" inverse="false" lazy="false" cascade="all">
  <key column="uidCustomerId" />
  <one-to-many class="Order" />
</set>

<id name="InternalId" column="uintOrderId" type="long">
  <generator class="identity" />
</id>

<!-- This BinaryBlob is a 16 byte array - Think Guid.NewGuid().ToByteArray -->
<property name="CustomerUid" column="uidCustomerId" type="BinaryBlob" not-null="true" /> 

<property name="OrderDate" column="datOrderDate" type="System.DateTime" not-null="true" />

因此有 2 个类:客户 - 具有上述映射中定义的属性的订单

客户 PK 是 uintCustomerId

订单PK是uintOrderId

uidCustomerId 是 Customer 表上的唯一键,是 Order 表上 Customer 的 fk uidCustomerId 是二进制(16)

数据库无法更改。

鉴于上述情况。我们如何使用 NHibernate Criteria API 进行查询,以提供给定日期之后的客户及其相关订单。注意:我们需要加入不是主键的 uidCustomerId。

这可以通过 Criteria API 完成吗? 这是可以用 HQL 完成的吗?

谢谢, 塔索斯

【问题讨论】:

  • 我不明白。如果您已经有了映射,为什么不像往常一样获取 Customer,而不是通过简单的 Customer.Orders 属性引用订单?
  • 感谢您的评论 Mufasa 如果您希望客户在特定日期之后收到订单,您将如何进行查询?

标签: .net nhibernate nhibernate-mapping


【解决方案1】:

我已经尝试过与您需要的类似的东西。这是我混搭的代码(未经测试)。

IList customers = sess.CreateCriteria(typeof(Customer))
    .CreateAlias("Orders", "order")  
    .CreateAlias("order.OrderDate", "orderdate")
    .Add( Expression.Ge("orderdate", somedate) )
    .List();

这是NH CreateAlias的一个很好的参考

【讨论】:

  • 感谢您指向正确方向的指针 - 我不知道 CreateAlias,更重要的是它如何允许在任意列上进行连接,正如我在 nhforge 文档示例中通过 Expression.EqProperty("kt .Name", "mt.Name") IList 猫 = sess.CreateCriteria(typeof(Cat)) .CreateAlias("Kittens", "kt") .CreateAlias("Mate", "mt") .Add( Expression.EqProperty ("kt.Name", "mt.Name") ) .List();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-16
  • 1970-01-01
  • 2023-02-04
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多