2008-10-31 87 views
4

我在使用nHibernate獲取命名查詢方面遇到了很多麻煩。我最近的問題是收到錯誤消息「無法執行查詢」,沒有附加信息。是否有任何完整的示例可以從某處下載,因爲所有的教程和文檔示例都提供了代碼瑕疵,但只講述了讓它起作用的一半故事。使用nHibernate命名查詢

這是給我的問題的代碼。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
namespace Model.Entities 
{ 
    public class TableInfo 
    { 
     public string TABLENAME { get; set; } 
     public string COLUMNNAME { get; set; } 
     #region Overrides 
     public override int GetHashCode() 
     { 
      int result = TABLENAME.GetHashCode(); 
      result += COLUMNNAME.GetHashCode(); 
      return result; 
     } 
     public override bool Equals(object obj) 
     { 
      if (obj == null) return false; 
      TableInfo dict = (TableInfo)obj; 
      return 
       dict.TABLENAME.IsEqual(this.TABLENAME) && 
       dict.COLUMNNAME.IsEqual(this.COLUMNNAME); 
     } 
     #endregion 
    } 
} 

映射文件

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

    <class name="Model.Entities.TableInfo, Model" table="UIM_TableColumnInfo"> 
    <composite-id> 
     <key-property name="TABLENAME" column="TABLENAME" type="string"></key-property> 
     <key-property name="COLUMNNAME" column="COLUMNNAME" type="string"></key-property> 
    </composite-id> 
    </class> 

    <sql-query name="GetTableInfo"> 
    <return alias="tableInfo" class="Model.Entities.TableInfo, Model"> 
     <return-property name="TABLENAME" column="TABLENAME"/> 
     <return-property name="COLUMNNAME" column="COLUMNNAME"/> 
    </return> 
    <![CDATA[ 
select 
     info.tci_table_name TABLENAME 
     , info.tci_column_name COLUMNNAME 
     from ALL_TAB_COLS c 
     ,(select 'DATE' TYPE_NAME, 'D' data_type_ind from dual 
      union select 'NUMBER','N' from dual 
      union select 'VARCHAR2','S' from dual 
     ) ct 
     , UIM_TableColumnInfo info 
     where c.DATA_TYPE   = ct.TYPE_NAME (+) 
       and c.column_id is not null 
     and UPPER(c.TABLE_NAME) = :TableName 
     and UPPER(c.COLUMN_NAME) = UPPER(info.tci_column_name (+)) 
     order by c.column_id 
    ]]> 
    </sql-query> 

</hibernate-mapping> 

長途區號

public List<TableInfo> GetTableInfo(string tableName) 
{ 
    return m_TableInfoRepository 
     .NamedQuery("GetTableInfo") 
     .SetString("TableName", tableName) 
     .List<TableInfo>() as List<TableInfo>; 
} 

回答

0

也許我錯了,但似乎ŧ帽子可能是表「TABLENAME」和參數「:TableName」之間的衝突,如果嘗試使用另一個參數名稱會發生​​什麼?

+0

我試過這個,但沒有任何區別。 – Craig 2008-10-31 03:43:19

0

內部異常應提供生成並嘗試運行的實際sql。將其粘貼到數據庫查詢中並直接在數據庫中運行。這將有助於引導你。一旦你知道爲什麼SQL不能執行,這將會容易得多