I\'m reasonably new to NHibernate and everything has been going pretty well so far but I\'ve come across a problem I\'m not exactly sure of how to go about solving. Basicall
Creating custom dialect extensions is rather easy:
public class CustomFunctionsMsSql2005Dialect : MsSql2005Dialect
{
public CustomFunctionsMsSql2005Dialect()
{
RegisterFunction("calculatedistance",
new SQLFunctionTemplate(NHibernateUtil.Int32,
"CalculateDistance(?1, ?2, ?3, ?4)"));
}
}
Register it, like so:
<property name="hibernate.dialect">
CustomFunctionsMsSql2005Dialect, MyAssembly
</property>
Now you can use it like any other HQL function in queries like those created with session.CreateQuery()
.
You could use SQL expression in your hibernate queries. Assuming you've mapped a Store
type you could write the following query:
var result = session
.CreateCriteria<Store>()
.Add(Expression.Sql(
"dbo.CalculateDistance({alias}.Latitude, {alias}.Longitude, ?, ?) < ?",
new object[] {
-118.4104684d,
34.1030032d,
100
},
new IType[] {
NHibernateUtil.Double,
NHibernateUtil.Double,
NHibernateUtil.Int32
}
))
.List<Store>();