HQL-Identificateur de ligne pour la pagination

est-ce que quelqu'un sait si HQL a un mot-clé pour identifier les lignes telles que ROWID ou ROWNUM?

je voudrais implémenter la pagination avec HQL mais je ne peux pas l'utiliser .setMaxResult () or .setFirstResult () parce que je ne travaille pas directement avec l'objet session et n'utilise donc pas L'objet Query mais crée simplement ma requête comme une chaîne de caractères et utilise la .méthode find ().

j'ai essayé D'utiliser LIMIT et OFFSET dans ma requête, mais HQL semble ignorer ces mots clés et me renvoie le résultat entier quoi qu'il arrive.

Je ne suis pas non plus capable d'utiliser des critères D'hibernation parce qu'il n'a pas de support pour la clause" avoir " qui apparaît dans ma requête.

mon dernier recours est de restreindre le jeu de résultats en utilisant le mot-clé ROWNUM/ROWID. Quelqu'un d'autre a d'autres suggestions?

8
demandé sur Pascal Thivent 2009-01-29 00:04:16

3 réponses

c'est une situation où hibernate brille:

solution typique avec requête hql.

int elementsPerBlock = 10;
int page = 2;

return  getSession().createQuery("from SomeItems order by id asc")
            .setFirstResult(elementsPerBlock * (page-1) + 1 )
            .setMaxResults(elementsPerBlock)
            .list();

hibernate va traduire ceci en un modèle qui est compris par la base de données selon son dialecte sql. sur oracle, il créera un sous-Select avec ROWNUM < X. sur postgresql il émettra une limite / OFFSET sur le serveur msSQL il émettra un TOP..

à ma connaissance, il n'est pas possible d'atteindre cela avec "pur" hql.

18
répondu Andreas Petersson 2009-05-08 14:38:52

Pagination utilisant L'Interface de requête:

il y a deux méthodes de l'interface de requête pour la pagination.

1. Requête setFirstResult (int startPosition): Cette méthode prend un entier qui représente la première ligne dans le jeu de résultats, en commençant par la ligne 0.

2. Requête setMaxResults (int maxResult): Cette méthode dit à Hibernate de récupérer un fixe nombre maxResults d'objets. En utilisant ensemble les deux méthodes ci-dessus, nous pouvons construire un composant de pagination dans notre application web ou Swing.

exemple:

Query query = session.createQuery("FROM Employee");
query.setFirstResult(5);
query.setMaxResults(10);
List<Employee> list = query.list();
for(Employee emp: list) {            
   System.out.println(emp);
}

Pagination à l'aide de Critères de l'Interface: Il y a deux méthodes de l'interface des critères pour la pagination.

1. Critèresfirstresult (intransigeant):

premier résultat à récupérer.

2. Article de la liste critères setMaxResults (int maxResults):

fixe une limite au nombre d'objets à récupérer.

exemple:

Criteria criteria = session.createCriteria(Employee.class);
criteria.setFirstResult(5);
criteria.setMaxResults(10);            
List<Employee> list = criteria.list();
for(Employee emp: list) {            
    System.out.println(emp);
}
2
répondu Ranga Reddy 2014-05-16 14:40:37

Eh bien, vous pouvez en principe accéder à ROWNUM/ROWID à partir de HSQL (même si Je ne l'ai jamais utilisé). Voir par exemple Ron's Weblog . Cela devrait fonctionner.

mais je tiens à souligner que vous travaillez vraiment contre Hibernate et HSQL si vous le faites comme ça. La bonne façon est d'utiliser setMaxResult() & friends. Si vous ne pouvez pas faire ce B/c de votre architecture, Je reconsidérerais au moins mes décisions architecturales. Je sais que ce sont toujours des changements difficiles à faire, mais il pourrait être en vaut la peine.

1
répondu sleske 2009-01-29 11:42:50