2010-09-14 77 views
2

我在MySQL中有一個表,其中nnnn是一個數字,它有一個形式爲「Xnnnn」的字符串列'Id'。流利的NHibernate和MySQL轉換語法?

我想找到最大的nnnn定義。所以,我有:

var c = s.CreateCriteria(typeof(Item)) 
    .AddOrder(Order.Desc(
    Projections.Cast(
     NHibernateUtil.Int32, 
     Projections.SqlFunction("substring", NHibernateUtil.String, 
           Projections.Property("Id"), 
           Projections.Constant(2), Projections.Constant(10))) 
     )) 
     .SetProjection(Projections.Property("Id")) 
     .SetMaxResults(1) 
     .List<string>(); 

但NHibernate的生成SQL:

SELECT this_.Id as y0_ FROM `Item` this_ 
    ORDER BY cast(substring(this_.Id, ?p0, ?p1) as INTEGER) desc limit ?p2 

MySQL的哪個不喜歡...它堅持:

cast(substring(this_.Id, ?p0, ?p1) as SIGNED INTEGER) 

我已經試過各種型號在演員陣容中,他們都沒有產生正確的輸出。我需要做的與映射工作一切正常。

有什麼建議嗎?

+1

你在用什麼方言? – 2010-09-14 12:46:44

+0

我沒有明確地配置一種方言,我使用的是流利的NHibernate,我假設它在那裏被處理。當我嘗試在配置中設置它時,有一個例外情況是該屬性已經設置。 – 2010-09-14 18:16:09

回答

1

這是NH中的一個bug。它已在3.0 Alpha2版本中修復。 請參閱NH-2261NH-2149以供參考。

我看到2個選項在這裏:

  1. 原生SQL查詢(執行Session.createSQLQuery())
  2. 升級到3.0 NH(請記住,它仍然是一個字母,相當穩定雖然)
+0

3)backport。當我用一種方言報告錯誤(在3.0中修復)時,fabio建議將3.0提供程序放入自定義的2.x版本中。這可能也適用。 – 2010-09-20 18:44:31

+0

@Gabe Moothart:是的,但過去曾經使用過這種解決方案,只要有可能就避免使用。它只是增加了另一個要記住的事情:「我們在自定義NH構建」。然而,如果您正在應用* 3.0中已經實施的相同更改,那麼這是一個不錯的選擇 – 2010-09-20 18:59:50