代码之家  ›  专栏  ›  技术社区  ›  Rob Walker

流畅的nhibernate和mysql cast语法?

  •  2
  • Rob Walker  · 技术社区  · 14 年前

    我在MySQL中有一个表,它的字符串列“id”的形式是“xnnnn”,其中nnnn是一个数字。

    我想找到定义的最大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 回复  |  直到 14 年前
        1
  •  1
  •   Filip Zawada    14 年前

    这是NH的一个漏洞。它在3.0 Alpha2版本中被修复。 见 NH-2261 NH-2149 供参考。

    我在这里看到两个选项:

    1. 本机SQL查询(session.createSqlQuery())
    2. 升级到nh 3.0(记住它仍然是alpha,不过相当稳定)