2009-12-04 6 views
5

Ich möchte in der Lage sein, eine benutzerdefinierte Funktion namens "recent_date" als Teil meiner HQL aufrufen. So: [Date] >= recent_date()Benutzerdefinierte SQL-Funktion für NHibernate Dialekt

Ich habe einen neuen Dialekt erstellt, der von MsSql2000Dialect erbte und den Dialekt für meine Konfiguration festlegte.

public class NordicMsSql2000Dialect : MsSql2000Dialect 
{ 
    public NordicMsSql2000Dialect() 
    { 
     RegisterFunction(
      "recent_date", 
      new SQLFunctionTemplate(
       NHibernateUtil.Date, 
       "dateadd(day, -15, getdate())" 
       ) 
      ); 
    } 
} 

var configuration = Fluently.Configure() 
.Database(
    MsSqlConfiguration.MsSql2000 
    .ConnectionString(c => ....) 
    .Cache(c => c.UseQueryCache().ProviderClass<HashtableCacheProvider>()) 
    .Dialect<NordicMsSql2000Dialect>() 
) 
.Mappings(m => ....) 
.BuildConfiguration(); 

Beim Aufruf recent_date() ich die folgende Fehlermeldung erhalten: System.Data.SqlClient.SqlException: ‚recent_date‘ ist nicht eine anerkannte Funktionsnamen

ich es in einer Erklärung, wo bin mit für ein HasMany-Mapping wie unten.

HasMany(x => x.RecentValues) 
    .Access.CamelCaseField(Prefix.Underscore) 
    .Cascade.SaveUpdate() 
    .Where("Date >= recent_date()"); 

Was fehlt mir hier?

Antwort

3

Ich denke, Where ist eine SQL-Anweisung, keine HQL-Anweisung. Es kennt also die Funktion nicht. Es funktioniert nur für HQL, in Abfragen oder Filtern.

+0

Leider namens, darüber. Ich hätte klarstellen sollen, dass "SELECT .... FROM SomeTable WHERE ...." nur ein Beispiel war. Wir verwenden diesen Teil nicht in unserem Code. –

+1

Die Antworten sagen, dass die .Where in Ihrem Mapping reine SQL keine Form von HQL erwartet. – Rashack

1

Ich dachte, du musst deine Funktion mit "dbo" voranstellen. wann immer du es benutzt hast. Mein benutzerdefinierter Dialekt hat dies:

RegisterFunction("dbo.isbounded", new SQLFunctionTemplate(NHibernateUtil.Double, "dbo.IsBounded(?1, ?2, ?3, ?4, ?5, ?6)")); 

Es ist dann

Expression.Sql("dbo.IsBounded(...)") 
+0

Danke. Aber funktioniert das für eine HasMany-Where-Anweisung wie oben? Laut dem unten stehenden Link kann where = "" nur einfaches altes SQL enthalten. Ich musste mich für eine andere Lösung entscheiden, da ich das Feature, an dem ich arbeitete, fertig bekommen musste. http://groups.google.com/group/fluent-nhibernate/browse_thread/thread/acd551226c351f77/edec6d52c12397d7?lnk=gst –

+0

Die Tatsache, dass Sie eine SQL-Ausnahme erhalten, würde darauf hinweisen, dass NHibernate sie an die SQL-Engine weiterleitet Daher ist es kein NHibernate-Problem beim Erkennen der Funktion. Daher würde ich ja sagen. In Bezug auf where-Klauseln nur unter Verwendung von rohen SQL; Wenn das der Fall ist, sollten Sie die Funktion überhaupt nicht registrieren und nur "dbo.recent_date()" in Ihre where-Klausel eingeben. – toxaq

+0

Ich denke nicht, dass dies funktioniert, da SQLite (nach meinem Wissen) keine benutzerdefinierten Funktionen unterstützt. Ich brauche die Lösung, um mit MsSql und SQLite zu arbeiten, und ich wollte dies auf Dialekt-Ebene tun. Irgendwelche Ideen? –

Verwandte Themen