Предположим, у меня есть следующее отображение со свойством 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>();
SQL:
SELECT somefunc() as formula0 FROM planets ORDER BY formula0
, но он заполняет только свойство Distance в результате, и я действительно хотел бы избежать проецирования вручную поверх всех других свойств моего объекта (может быть много других свойств).
Это достижимо с помощью NHibernate? В качестве бонуса я хотел бы передать параметры нативной функции somefunc()
SQL. Все, что создает желаемый SQL, является приемлемым (замена поля формулы на подвыборы и т. Д.), Важно иметь рассчитанное свойство Distance в результирующем объекте и порядок на это расстояние внутри SQL.