2009-06-09 10 views
9

Estoy usando NHibernate versión 2.0.0.4000.NHibernate: No se requiere para NHibernate.Criterion.SqlFunctionProjection

En una de mis consultas quise hacer uso de la función sql dateadd para agregar un número de días. Esto no se registró así que creé mi propio dialecto y registró la función como sigue:

RegisterFunction("adddays", 
    new SQLFunctionTemplate(NHibernateUtil.DateTime, 
    "dateadd(dd, ?1, ?2)")); 

El registro es golpeado y parece funcionar bien. Utilizo la función en una consulta DetachedCriteria como sigue:

... 
Restrictions.LtProperty("DateColumn1" 
    Projections.SqlFunction("adddays", NHibernateUtil.DateTime, 
     Projections.Constant(days), 
     Projections.Property("DateColumn2")) 
... 

Los criterios se volvió de un método y pasa de a otra consulta. Tras la ejecución de la consulta final recibo la siguiente excepción:

NHibernate.MappingException was caught 
    Message="No persister for: NHibernate.Criterion.SqlFunctionProjection" 
    Source="NHibernate" 
    StackTrace: 
     at NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(String entityName, 
      Boolean throwIfNotFound) 
     at NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(String entityName) 
     ... 

Ninguna de las publicaciones de blog que he visto menciona este problema. ¿Alguien puede ayudar?

Saludos con anticipación. Nige.

Respuesta

6

Lo resuelto.

El problema fue causado por mi uso en otro lugar de Restrictions.Eq en lugar de Restrictions.EqProperty. El primero no tiene una sobrecarga para (IProjection,IProjection) y por eso estaba tratando la segunda proyección como un objeto y pasándola a una persistencia.

Gracias a todos los que han investigado esto. Nigel.

1

Para persister Sin excepción en solución nhibernet es

acaba de dar un clic derecho sobre el archivo correspondiente HBM -> Propiedades-> cambiar el tipo de construcción Acción-> Recurso incrustado

con la aplicación paso por encima va a funcionar bien

Cuestiones relacionadas