代码之家  ›  专栏  ›  技术社区  ›  Darin Dimitrov

NHibernate中按公式字段排序

  •  4
  • Darin Dimitrov  · 技术社区  · 15 年前

    假设我有一个 formula 属性:

    <class name="Planet" table="planets">
        <id name="Id" column="id">
            <generator class="native" />
        </id>
    
        <!-- somefunc() is a native SQL function -->
        <property name="Distance" formula="somefunc()" />
    </class>
    

    Distance

    var planets = session
        .CreateCriteria<Planet>()
        .AddOrder(Order.Asc("Distance"))
        .List<Planet>();
    

    这将转换为以下查询:

    SELECT Id as id0, somefunc() as formula0 FROM planets ORDER BY somefunc()
    

    SELECT Id as id0, somefunc() as formula0 FROM planets ORDER BY formula0
    

    如果使用别名设置投影,效果很好:

    var planets = session
        .CreateCriteria<Planet>()
        .SetProjection(Projections.Alias(Projections.Property("Distance"), "dist"))
        .AddOrder(Order.Asc("dist"))
        .List<Planet>();
    

    SELECT somefunc() as formula0 FROM planets ORDER BY formula0
    

    但它只填充结果中的Distance属性,我非常喜欢避免手动投影到对象的所有其他属性上(可能有许多其他属性)。

    NHibernate可以实现吗?作为奖励,我想把参数传递给本机 somefunc() SQL函数。任何产生所需SQL的内容都是可以接受的(用subselect等替换公式字段),重要的是在结果对象中具有计算距离属性,并在SQL中按此距离排序。

    1 回复  |  直到 15 年前
        1
  •  4
  •   gbn    15 年前

    这两个在SQL中完全相同。为什么重要?

    SELECT Id as id0, somefunc() as formula0 FROM planets ORDER BY somefunc()
    SELECT Id as id0, somefunc() as formula0 FROM planets ORDER BY formula0
    

    编辑,还是一样的:

    SELECT Id as id0, somefunc(1, 'fish') as formula0 FROM planets ORDER BY somefunc(1, 'fish')
    SELECT Id as id0, somefunc(1, 'fish') as formula0 FROM planets ORDER BY formula0