2009-04-28 8 views
4

J'utilise une base de données qui a un format de date bizarre. J'ai écrit un UserType pour transférer .NET DateTime standard vers/à partir du format bizarre et cela fonctionne très bien.NHibernate: HQL et UserTypes comme paramètres de requête

J'ai normalement utilisé des requêtes ICriteria mais j'ai décidé d'essayer IQuery en utilisant HQL sur ce projet. J'ai rencontré un problème que la requête ne traduit pas les paramètres au UserType approprié.

par exemple:

IQuery query = session.CreateQuery("from OfflineShipmentLineItem as line join fetch line.Shipment as shipment join fetch line.Extension where shipment.ShipmentDate = :date"); 
query.SetParameter("date", date); 

return query.List<OfflineShipmentLineItem>(); 

Les coups au-dessus parce que la requête sur shipment.ShipmentDate finit par être '4/28/2009 12:00:00' au lieu du format UserType.

Si je place ICriteria il fonctionne très bien:

ICriteria criteria = session.CreateCriteria(typeof(OfflineShipmentLineItem)); 

criteria.SetFetchMode("Shipment", FetchMode.Eager); 
criteria.SetFetchMode("Extension", FetchMode.Eager); 

criteria.CreateAlias("Shipment", "shipment"); 

criteria.Add(Expression.Eq("shipment.ShipmentDate", date)); 

return criteria.List<OfflineShipmentLineItem>(); 

Tout fonctionne bien parce que la date est traduite en utilisant le UserType pour shipment.ShipmentDate.

Ai-je manqué quelque chose à faire allusion à HQL quoi faire?

Répondre

7

Je n'ai pas le temps de m'essayer mais j'essaye d'ajouter aussi les 3èmes arguments de SetParameter (le IType). En tant que paramètre utilisez NHUtils.Custom (typeof (YourIUserType))

+0

Vous êtes génial, travaillé! Je ne suis pas sûr de savoir comment j'ai raté ça. Je me suis dit qu'il devait y avoir un moyen d'aider HQL à trouver quoi faire. – anonymous

+0

Ce comportement a changé pour "faire la bonne chose" (agir comme des critères et appeler le IUserType) dans NH 2.1.2, mais votre astuce résout mon problème pour 2.1.0 (sur lequel je suis bloqué pour diverses raisons). Merci pour cela! –