【问题标题】:Not sure how to join tables using Fluent NHibernate不确定如何使用 Fluent NHibernate 连接表
【发布时间】:2013-09-17 20:33:01
【问题描述】:

我在遗留表上使用 NHibernate,在查看了我们的代码库之后,我似乎是唯一有这种需求的人。我需要加入两个表,这样我才能运行查询,但我今天没有任何进展。我将尝试在我的代码 sn-ps 中缩写它有意义的地方。愿意帮忙吗?

表格--

Order
 OrderID (primary key)
 OrderName
 OrderType
 OrderLocation

OrderAppendix
 ID (composite key)
 Key (composite key)
 Value (composite key)

OrderAppendix 复合键的 ID 部分与 Order 表中的 OrderID 相关联;因此,Order 在 OrderAppendix 表中可以有多个条目。

域对象--

[Serializable]
public class Order
{
     public virtual string OrderID { get; set; }
     ...
     public virtual string OrderLocation { get; set; }
}

[Serializable]
public class OrderAppendix
{
     public virtual string ID { get; set; }
     public virtual string Key { get; set; }
     public virtual string Value { get; set; }

     public override bool Equals(object obj)
     {
          ...
     }

     public override int GetHashCode()
     {
          ...
     }
}

映射

internal sealed class OrderMap : ClassMap<Order>
{
     Table("Order");
     Id(x => x.OrderID).Column("OrderID").Length(20).GeneratedBy.Assigned();
     Map( x => x.OrderName).Column("OrderName")
     ....
}

internal sealed class OrderAppendixMap : ClassMap<OrderAppendix>
{
     Table("OrderAppendix");
     CompositeId()
         .KeyProperty(x => x.ID, "ID")
         ....
     Map( x => x.ID).Column("ID);
     ...
}

我不会因为加入这些表的徒劳尝试而混淆这一点,但我想做的是通过 OrderType 或 OrderLocation 之类的东西进行查询,因为结果都具有来自 OrderAppendix 表的相同值。

所需的 SQL 示例

SELECT * FROM ORDER
INNER JOIN
 ON Order.OrderID = OrderAppendix.ID
WHERE OrderAppendix.Key = "Stuff"

编辑

这是我通过阅读有关“QueryOver”的文档得到的结果

http://nhibernate.info/doc/nh/en/index.html#queryqueryover

Order Order = null;
OrderAppendix OrderAppendix = null;

resultList = session.QueryOver<Order>(() => Order)
     .JoinAlias(() => Order.OrderAppendix, () => OrderAppendix)
     .Where(() => OrderAppendix.Key == "MatchThis")
     .List();

我认为我在使用别名加入表格时走在正确的轨道上,但显然我还没有找到一种方法来通知 NHibernate 所需的多对一映射。此外,您可以看到我已将 OrderAppendix 类型的属性添加到 Order 以使用别名功能。

【问题讨论】:

  • 如果我可以在运行时加入表并且只针对这个查询,我也会更喜欢。

标签: nhibernate fluent-nhibernate nhibernate-mapping linq-to-nhibernate fluent-nhibernate-mapping


【解决方案1】:

好吧,我不明白您为什么不使用标准的父子方法,在订单方面使用 HasMany 并在附录的参考中使用。这是因为附录侧的复合键?

如果您愿意,您将能够提供以下 HQL:

SELECT o FROM Order o LEFT JOIN FETCH o.apxs a WHERE a.Key="Stuff"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2014-01-24
    相关资源
    最近更新 更多