2013-05-02 22 views
1

我有如下表型號選擇:NHibernate的標準從不同的表

enter image description here

我想下面的SQL命令,NHibernate的標準:

SELECT * FROM所在單位OID IN(SELECT OID FROM Orders WHERE PON號碼<> 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); 

THX

+0

您對Criteria API有哪些特定的困難? – 2013-05-02 17:38:42

回答

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

UPDATE

你也可以只加載Order實體。 NHibernate會根據你的映射信息(懶惰/渴望加載或聯接)自動加載所有單元行。

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

Thx!如何正確檢索結果列表?我收到了錯誤信息{「不是關聯:ID」} ???! – leon22 2013-05-03 08:27:55

+0

我想我必須看到你的映射。我的帖子中沒有看到任何ID字段。也許問題在於映射? – Iridio 2013-05-03 09:48:11

+0

映射添加!謝謝! – leon22 2013-05-03 12:08:31