2009-02-16 7 views

Répondre

30

Il est en fait assez facile à HQL:

var top15 = session.CreateQuery("from SomeEntity") 
       .SetFirstResult(0) 
       .SetMaxResults(15) 
       .List<SomeEntity>(); 

Je ne sais pas comment faire cela en utilisant l'API de critères bien.

+0

+1. Huh c'est plutôt bizarre. Je pensais que la réponse ferait partie de la chaîne "tunnelée" HQL. Intéressant. – BuddyJoe

+3

Cette réponse est en fait un hybride de HQL et les critères API –

+0

yea..it est essentiellement le même que les critères ... il suffit de remplacer par 'CreateCriteria ()' – dotjoe

10

Critères API Méthode:

ICriteria criteria = DaoSession.CreateCriteria(typeof(T)); 
criteria.SetFirstResult(StartIndex); 
criteria.SetMaxResults(MaximumObjects); 
return criteria.List<T>(); 
+0

+1. Je vais devoir regarder dans ce MaximumObjects. Plutôt cool. – BuddyJoe

+1

MaximumObjects est simplement une variable entière pour indiquer à SetMaxResults le nombre d'objets à renvoyer. Dans votre cas, vous pouvez écrire le code 15 à la place, c'est-à-dire criteria.SetMaxResults (15); –

+0

Haha ... donc en d'autres termes, il est identique à CreateQuery() après la création de l'instance. –

0

Pour être complet, voici comment le faire avec l'API QueryOver introduit dans NHibernate 3.0:

var top15 = session.QueryOver<SomeEntity>().Take(15).List(); 

Throw dans un .Skip(someInt) si vous devez définir un indice de départ, par exemple pour la pagination.

0

mookid8000 donne de fausses informations.

il n'y a aucun moyen de réglage SQL TOP N avec HQL :(

il télécharge toujours tout de la table à .NET et prend le TOP, Wich est tout simplement stupide!

2

De NHibernate 3.2 vous pouvez utiliser SKIP n/TAKE n dans hql à la fin de la requête Il pourrait être très utile dans les sous-requêtes où vous ne pouvez pas utiliser SetMaxResults

Par exemple:..

select l, (select u from User u where u.Location = l order by u.Date asc take 1) 
from Location l