web-dev-qa-db-fra.com

Requête HQL pour vérifier si la taille de la collection est 0 ou vide

J'essaie de générer une requête HQL qui inclut l'utilisateur avec une collection d'appointements vide (mappée par OneToMany):

SELECT u FROM User u JOIN u.appointments uas WHERE u.status = 1 AND (uas.time.end < :date OR size(uas) = 0)

Je l'essaye de plusieurs manières (NOT EXIST ELEMENT(), IS NULL) voir aussi: Comment vérifier si la collection est vide dans NHibernate (HQL)? (Cela ne fonctionne pas pour moi)

mais toujours pas le résultat que je veux voir ou une erreur dans HQL ou SQL SERVER

Remarque:

la requête sans JOIN fonctionne:

"FROM User u WHERE u.status = 1 AND size(u.appointments) = 0"

Résolu

Un autre JOIN a résolu le problème:

SELECT u FROM User u LEFT JOIN u.appointments pas1 LEFT JOIN pas1.slot t WHERE u.status = 1 AND t.end <= :date1 OR t.end IS NULL ORDER BY u.name asc
26
Michel

En utilisant IS EMPTY devrait fonctionner (je préférerais une syntaxe JPQL):

SELECT u FROM User u WHERE u.status = 1 AND u.appointments IS EMPTY

Si ce n'est pas le cas, veuillez afficher le SQL généré.

Références

  • Guide de référence Hibernate Core
  • Spécification JPA 1.0
    • Section 4.6.11 "Expressions de comparaison de collections vides"
47
Pascal Thivent

Avez-vous jeté un œil à votre SQL généré? Votre méthode fonctionne bien ici:

// Hibernate query:
const string hql = "from User u where u.Id = 101 and size(u.Appointments) = 0";


// Generates this working SQL:
select user0_.Id    as Id20_,
       user0_.Name as Name2_20_
from   User user0_
where  user0_.Id = 101
       and (select count(appointment1_.Id_Solicitud)
            from   Appointment appointment1_
            where  user0_.Id = appointment1_.Id_User) = 0
13
rebelliard
// Hibernate query:
const string hql = "from User u where u.Id = 101 and size(u.Appointments) = 0";
6
fez