2009-11-19 3 views
0

Je suis en train d'utiliser l'API de critères dans le scénario suivant:Utilisation de l'API Critères Hibernate pour interroger plusieurs-à-un avec les projections

  • J'ai deux tables, Schedule et Route (avec leurs classes et applications).
  • Route a une relation plusieurs-à-un avec Schedule.
  • Route a une propriété entière sequence.

Maintenant je dois aller chercher tous les objets Schedule dont les objets d'itinéraire associés remplir la condition suivante:

route.sequence=no. of all Route objects associated with the given Schedule object 

J'ai essayé le code de critères suivants pour elle:

Criteria crit = getSession().createCriteria(getPersistentClass()) 
    .createCriteria("routes", "route") 
    .setProjection(Projections.projectionList() 
    .add(Projections.rowCount(), "routeCount")) 
    .add(Restrictions.not(Restrictions.ltProperty("route.sequence", "routeCount"))); 

Mais génère le SQL suivant:

select count(*) as y0_ 
from schedule this_ 
inner join route route1_ on this_.ID=route1_.scheduleId 
where route1_.sequence<y0_ 

et jette l'erreur suivante:

Unknown column 'y0_' in 'where clause' 

S'il vous plaît aidez-moi si vous avez des suggestions.

+0

Je ne comprends pas votre condition de pseudocode. Voulez-vous réellement dire que toutes les routes doivent avoir le même numéro de séquence? – meriton

+0

Un objet Schedule peut avoir n objets Route. (où n est 2 ou 3 habituellement). La valeur de Route.sequence peut aller de 0 à n-1. En fait, il s'agit d'un schéma pour un système d'information de vol simple. Le tableau des horaires contient des informations telles que le numéro de vol, la date et l'heure du vol et l'état du vol. Les villes qui composent la route du vol sont placées dans la table Route (car il peut y avoir un nombre variable de villes de route pour chaque vol). Le numéro de route.sequence identifie la séquence dans laquelle une ville se trouve pour un vol. – craftsman

+0

La requête que j'ai essayé de faire avec l'API Criteria est de rechercher tous les vols qui arrivent à une ville donnée X. – craftsman

Répondre

1

Le problème provient d'un problème de mise en œuvre avec des projections et des restrictions. Il semblait qu'il y avait un bug quand on essayait de projeter et de restreindre sur la même colonne - le sql généré n'était pas valide. Vous constaterez que si vous exécutez ce sql directement sur votre base de données, cela ne fonctionnera pas.

Le bug a été à l'origine enregistré here et il semblerait que ce ne serait pas réparé. Mais ensuite, je vois un autre bug similaire a été enregistré here mais je ne peux pas savoir à quelle version le correctif sera disponible po

La discussion qui traite plus du problème et de la théorie derrière elle peut être trouvée here. Il y a également another stackoverflow item dealing with the same question et offre une solution. Je n'ai pas essayé de voir si cette approche fonctionnait, mais elle semblait fonctionner pour les personnes impliquées dans le problème.

Questions connexes