【问题标题】:nhibernate criteria for selecting from different tables从不同表中选择的休眠标准
【发布时间】:2013-05-02 12:51:36
【问题描述】:

我有以下表格模型:

我希望以下 SQL 命令作为休眠条件:

SELECT * FROM Units WHERE OID IN (SELECT OID FROM Orders WHERE PONumber 0 ORDER BY PONumber LIMIT 5)

-> 换句话说:最后 5 个订单

编辑:

我的映射

Unit.hbm.xml

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                  assembly="DCGOrderSystem"
                  namespace="DCGOrderSystem.Model">

  <class name="Unit" table="Units">
    <id name="ID">
      <column name="UID" />
      <generator class="native" />
    </id>

    <property name="Division" />
    <property name="Date" />
    <property name="ItemOrderNr" />
    <property name="Description" />
    <property name="Amount" />
    <property name="Price" />
    <property name="CostCenter" />
    <property name="Location" />
    <property name="DeviceGroup" />
    <property name="Comment" />
    <property name="Distributor" />

    <!-- Many-to-one mapping: Employee -->
    <many-to-one name="EmployeeRef" column="EID" cascade="all" />

    <!-- Many-to-one mapping: Order -->
    <many-to-one name="OrderRef" column="OID" cascade="all" />
  </class>

</hibernate-mapping>

Order.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                  assembly="DCGOrderSystem"
                  namespace="DCGOrderSystem.Model">

  <class name="Order" table="Orders">
    <id name="ID">
      <column name="OID" />
      <generator class="native" />
    </id>

    <property name="Locked" />
    <property name="PONumber" />

    <!-- One-to-many mapping: Units -->
    <bag name="Units" cascade="all" lazy="true">
      <key column="OID" />
      <one-to-many class="Unit" />
    </bag>
  </class>

</hibernate-mapping>

Employee.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                  assembly="DCGOrderSystem"
                  namespace="DCGOrderSystem.Model">

  <class name="Employee" table="Employees">
    <id name="ID">
      <column name="EID" />
      <generator class="native" />
    </id>

    <property name="Name" />   
  </class>

</hibernate-mapping>

EDIT2:

这里是我的查询命令:

var query = m_hibernateSession.QueryOver<Model.Order>(() => orderAlias)
                    .JoinAlias(() => orderAlias.ID, () => unitAlias, JoinType.InnerJoin)
                    .TransformUsing(Transformers.DistinctRootEntity)
                    .OrderBy(x => x.PONumber).Desc.Take(5);

谢谢

【问题讨论】:

  • 您在使用 Criteria API 时遇到了哪些具体困难?

标签: c# sql sqlite nhibernate


【解决方案1】:

如果您想要最后五个订单,我会使用稍微不同的查询来解决问题

Select * 
From order o join Units U on O.OID = U.OID
Order by O.PONumber limit 5

在 nhibernate 中会是这样的(未测试)

Order orderAlias = null;
Unit unitAlias = null;
var query = session.QueryOver<Order>(() => orderAlias)
   .JoinAlias(() => orderAlias.Units, () => unitAlias, JoinType.InnerJoin)
   //.TransformUsing(Transformers.DistinctRootEntity) if you have duplicates
   .OrderBy(x => x.PONumber).Desc.Take(5);

更新

您也可以只加载Order 实体。 NHibernate 将根据您的映射信息(延迟/急切加载或连接)自动加载所有单元行。

var query = session.QueryOver<Order>().OrderBy(x => x.PONumber).Desc.Take(5);

【讨论】:

  • 谢谢!如何正确检索结果列表?我收到错误消息 {"not an association: ID"}???!
  • 我想我得看看你的映射。我在您的帖子中没有看到任何 ID 字段。也许问题出在映射上?
  • 问题似乎是你的类列被命名为ID,而DB 列被命名为OID。把orderAlias.OID换成orderAlias.ID应该没问题
  • 不要这么认为!查看源代码中的edit2(我使用ID进行查询)!还有其他建议吗?为什么别名为空或我应该设置哪个值?!谢谢
  • 哈哈。我的错!我被身份证的事情分心了。我的代码是错误的,因为关系是 Order.Units 而不是 Order.ID。更新了我的代码。对不起队友:)
猜你喜欢
  • 2015-05-09
  • 1970-01-01
  • 1970-01-01
  • 2017-05-25
  • 1970-01-01
  • 1970-01-01
  • 2018-01-01
  • 2015-08-29
  • 2017-01-12
相关资源
最近更新 更多