[Hibernate]Filtrer une requete avec une methode java

Filtrer une requete avec une methode java [Hibernate] - Java - Programmation

Marsh Posté le 15-02-2006 à 10:40:53    

Bonjour,
 
ja voudrais savoir s'il hibernate donnait la possibilité de filtrer le resultat d'une requete à l'aide d'une methode java; je m'explique :
 
je travaille actuellement sur une application qui construit une requete dynamique en hql, puis l'execute et renvoie une liste de resultats. j'utilise egalement les possibilités de pagination de hibernate (maxResult, firstResult) et calcule le nombre total de pages à l'aide d'un count(*).
 
Cependant, je dois dorenavant gerer la securite liée à cette recherche, en excluant certains resultats retournés. Le problème est que la fonction qui m'est fournie pour gerer la validité de mes resultats (supposons qu'ils soient des instances de la classe MyBean) est de la forme

Code :
  1. boolean isBeanAuthorized(MyBean var);


 
Si je fais le filtrage à posteriori, ma pagination tombe à l'eau (sur une requete retournant 40 resultats, il se peut que j'en garde 12, 22, 40 voire 0 ce qui m'oblige à faire plusieurs requetes pour gerer ma page et surtout qui rend impossible le calcul du nombre total de pages, car rapatrier tous les enregistrements de la table et les filtrer un par un pour savoir combien sont valides n'est pas viable au vu de la taille de la table).
 
Bref, il faut que j'effectue mon filtrage au moment de la requete. Or les contraintes qui me sont imposées (en particulier le fait que je ne sache rien de la methode de validation des données si ce n'est sa signature) font que je ne vois pas comment m'en sortir. Hibernate donne la possibilité d'effectuer des filtres mais de ce que j'en ai vu, ça reste assez limité (et ça ne convient pas pour que que je veux faire)
 
Bref, si quelqu'un a une solution (ou une piste) qui me permettrait de fire mon filtre tout en gardant la pagination et notamment en pouvant calculer le nombre de pages retournés par la requete, je suis preneur.
 
Merci :jap:
 
(j'utilise hibernate 3.0, une base oracle 9i et un jdk 1.4.3)


---------------
.
Reply

Marsh Posté le 15-02-2006 à 10:40:53   

Reply

Marsh Posté le 15-02-2006 à 11:04:00    

je dirais qu'il faut que tu arrive à transposer la logique de ta méthode dans ta requête HQL...

Reply

Marsh Posté le 15-02-2006 à 11:15:20    

brisssou a écrit :

je dirais qu'il faut que tu arrive à transposer la logique de ta méthode dans ta requête HQL...


 
 
Si seulement je pouvais :'(
 
L'application sur laquelle je travaille est en fait un module d'une application plus grosse (et surtout distribuée). La communication entre les differents modules se fait par un flux xml et le module qui s'occupe du filtrage s'appuie sur une autre table à laquelle je n'ai pas du tout accès. Donc quand bien meme j'aurais accès à la logique applicative, la table contenant les gestions de restrictions m'est invisible (en supposant qu'elle soit contenue dans le meme sgbdr ce qui n'est meme pas sur d'ailleurs...)
 
A l'heure actuelle, je vais laisser tomber l'affichage du nombre de pages et m'appuyer sur la pagination de hibernate pour faire ma propre pagination apres filtrage. Néanmoins, ça reste une regression fonctionnelle ( :( ) mais je vois pas quoi faire d'autre.


---------------
.
Reply

Marsh Posté le 15-02-2006 à 11:43:37    

alors là... pfr

Reply

Marsh Posté le 15-02-2006 à 13:28:47    

il me semble que tu peux "customiser" la pagination - i.e. fournir tes propres implementations des classes qui la gèrent.
(en wrappant les originales ça doit pas etre bien compliqué)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 15-02-2006 à 17:16:17    

the real moins moins a écrit :

il me semble que tu peux "customiser" la pagination - i.e. fournir tes propres implementations des classes qui la gèrent.
(en wrappant les originales ça doit pas etre bien compliqué)


 
 
je ne pense pas que ça soit possible :\
 
Visiblement, hibernate effectue la pagination en utilisant les fonctionnalités du sgdb; sous oracle il englobe la requete dans une autre requete du type :
 

Code :
  1. select * from
  2. ( select row_.*, rownum rownum_
  3.    from ( ma_requete) ) row_
  4.    where rownum <= ?)
  5. where rownum_ > ?


 
A aucun moment, il n'est possible de specifier des contraintes "java" lors de la requete/pagination, hibernate convertit tout en sql et balance ça au sgbdr...
 
de toutes façons, je crois que mon problème est insoluble en l'etat :'(, je vais essayer d'iterer sur tous les resultats mais en terme de perfs, c'est vraiment pas terrible (pour ne pas dire catastrophique...).


---------------
.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed