0 votes

Un à plusieurs avec question de critères

entrez le code iciJe veux appliquer des restrictions sur la liste des éléments, de sorte que seuls les éléments à partir de certaines dates données seront récupérés.

Voici mes mappings:

J'ai essayé ce code:

Criteria crit = session.createCriteria(MyClass.class);
crit.add( Restrictions.eq("myId", new Integer(1)));
crit = crit.createCriteria("items").add( Restrictions.le("startDate", new Date()) );

ce qui donne les requêtes suivantes:

select ...
from MyTable this_ inner join Items items1_ on this_.myId=items1_.myId 
where this_.myId=? and items1_.startDate<=?

suivi par

select ...
from Items items0_ 
where items0_.myId=?

Mais ce dont j'ai besoin est quelque chose comme:

select ...
from MyTable this_ 
where this_.myId=?

suivi par

select ...
from Items items0_ 
where items0_.myId=? and items0_.startDate<=?

Une idée de comment je peux appliquer un critère sur la liste des éléments?

0voto

ChssPly76 Points 53452

Vous avez deux options ici :
A) Vous pouvez définir un filtre sur la collection "items" de MyClass :

Vous l'appliqueriez ensuite en appelant

session.enableFilter("startDateFilter").setParameter("startDate", new Date());

avant de récupérer votre objet. Dans ce scénario, vous ne spécifieriez que des critères basés sur MyClass, pas sur Item (si vous avez besoin de critères du tout, vous pouvez simplement utiliser session.load() si tout ce dont vous avez besoin est l'id).

B) Définissez votre collection items pour un chargement paresseux. Interrogez (ou récupérez par id) votre objet MyClass, puis créez des critères uniquement basés sur Item (sans lien vers MyClass) :

Criteria crit = session.createCriteria(Item.class);
crit.add( Restrictions.le("startDate", new Date()) );

Cela retournerait une liste d'Items (qui, d'après votre mapping, n'ont de toute façon pas de lien de retour vers MyClass). L'option (B) produirait les requêtes SQL que vous recherchez.

0voto

Steve Ebersole Points 3544
Criteria crit = session.createCriteria(MyClass.class);
crit.add(Restrictions.eq("myId", new Integer(1)));
crit.setFetchMode("items", FetchMode#JOIN);
crit = crit.createCriteria("items").add(Restrictions.le("startDate", new Date()));

Sachez simplement que vous créez une vue filtrée "en direct" de cette collection. Si vous constatez des cas où tous les autres éléments qui devraient faire partie de cette collection commencent à être supprimés, vous savez exactement où chercher.

Il est beaucoup plus judicieux de simplement interroger directement la liste des éléments souhaités :

String hql = "select i from MyClass m inner join m.items i where i.startDate <= :theDate";
List items = session.createQuery(hql)
        .setParameter("theDate", theDate)
        .list();

Vous pouvez faire de même avec Criteria en utilisant des projections.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X