2009-11-12 9 views
0

J'ai besoin de savoir comment je peux réécrire la requête SQL suivante dans le format ICriteria de NHibernate. Il s'agit essentiellement d'un moyen d'imiter la fonction RANK() de MS-SQL et de renvoyer uniquement les résultats les plus récents.Besoin d'aide pour une requête SQL complexe dans NHibernate

SELECT a.Name, a.Value, a.CreationDate 
FROM MyTable a 
WHERE EXISTS 
(
    SELECT NULL 
    FROM 
    (
    SELECT TOP 1 CreationDate 
    FROM MyTable 
    WHERE Name = a.Name 
    ORDER BY CreationDate DESC 
) b 
    WHERE b.CreationDate = a.CreationDate 
) 

Par exemple, étant donné une table avec les données suivantes:

NOM, VALEUR, CREATIONDATE
'une clé', 'valeur un v1', '2009-11-11'
' Key One ',' value one v2 ',' 2009-11-12 '
' Clé deux ',' valeur deux v1 ',' 2009-11-09 '
' Clé trois ',' valeur trois v2 ', '2009-09-09'
'Trois clés', 'valeur trois v1', '2009-09-06'
'Trois clés », 'Valeur trois v3', '2009-10-01'

Les résultats de la requête ci-dessus serait:

'une clé', 'valeur une v2', '2009-11-12'
'Key Two', 'valeur deux v1', '2009-11-09'
'trois clés', « valeur trois v3, '2009-10-01'

Répondre

0

Lorsque la requête complexe, don N'utilisez pas "Criteria API" mais "HQL", vous pouvez perdre beaucoup de temps à trouver la bonne solution avec "Criteria API". La requête que vous montrez peut presque être utilisée sans changement. Regardez ceci: https://www.hibernate.org/hib_docs/nhibernate/html/queryhql.html

A la fin du code généré est, en général, la même chose avec "API Critères" ou "HQL" ...

Un morceau de code:

StringBuilder query = new StringBuilder(); 
query.Append("from MyTable where "); 
query.Append("DateOfDayStart <= :startDate and DateOfDayEnd >= :endDate "); 
IList<MyTable> list = session.CreateQuery(query.ToString()) 
    .SetDateTime("startDate", startDate) 
    .SetDateTime("endDate", endDate) 
    .List<MyTable>(); 
return list;