Trato de generar una consulta HQL que incluyen usuario con un vacío cita con él colecciones(asignada por OneToMany):

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

Me intenta en varias maneras (NOT EXIST ELEMENT(), IS NULL)
véase también: Cómo comprobar si la colección está vacía en NHibernate (HQL)? (Esto no funciona para mí)

pero aún no es el resultado que quiero ver o algún error en HQL o SQL SERVER

Nota:

la consulta sin funciona la combinación:

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

Resuelto

Otra UNIRSE resuelto el problema:

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
InformationsquelleAutor Michel | 2010-09-21

3 Comentarios

  1. 45

    Utilizando IS EMPTY debería funcionar (yo estaría a favor de un JPQL sintaxis):

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

    Si no, por favor, mostrar el SQL generado.

    Referencias

    • Hibernate Core Guía De Referencia
    • La especificación JPA 1.0
      • Sección 4.6.11 «Vacío De La Colección De Las Expresiones De Comparación»
    • por desgracia ‘ «DE Usuario u UNIRSE u.las citas de la uas, DONDE u.estado = 1 Y la uca está vacía» ‘ no funciona. Me da no a los usuarios. Y hay una gran cantidad de usuarios sin citas
    • Esa no es la consulta que me sugieren (era todavía de edición).
    • mm tu sugerencia funciona, pero yo necesitaba que se UNEN. Estoy buscando el método para utilizar el tamaño o está vacío en combinación con la combinación, Gracias por su apoyo
    • ¿Por qué necesita la combinación? Su consulta con la combinación devolverá sólo los usuarios con valores coincidentes en la condición de combinación (es decir, los usuarios de con citas).
    • La necesito porque tengo todos los usuarios con las citas no más de 10 días por ejemplo y sin citas
    • Usted puede ser que necesite un LEFT JOIN luego, no un INNER JOIN. Su consulta actual (sin la condición de la comisión de nombramientos tamaño) no es hacer lo que desea.
    • algo como esto: –> SELECCIONAR u DE Usuario u LEFT JOIN u.las citas de la uas, DONDE u.estado = 1 Y (uas.ranura.final <= :fecha1 O el tamaño(u.citas) = 0 ) ORDER BY u.nombre asc <– Esto me da sólo a los usuarios con citas y –> SELECCIONAR u DE Usuario u LEFT JOIN u.las citas de la uas, DONDE u.estado = 1 Y (uas.ranura.final <= :fecha1 O el tamaño(uas) = 0 ) ORDER BY u.nombre asc <– me da el error de: «de java.lang.StringIndexOutOfBoundsException: Cadena de índice fuera de rango: -5» por CIERTO: cuando se utiliza «ESTÁ VACÍA» no STringIndexOutOfBoundsException pero sólo 2 de los usuarios en lugar de a miles
    • Es difícil hablar de esto en un cuadro de comentarios, pero ¿está usted de acuerdo que SELECT u FROM User u JOIN u.appointments uas WHERE u.status = 1 no devuelve ningún registro sin citas (y por ende, no es lo que quieres?)
    • BTW: when using "IS EMPTY" no STringIndexOutOfBoundsException but only 2 users instead of thousands Mostrar el SQL generado.
    • Me doble de acuerdo con usted, difícil de discus el problema aquí y SELECCIONA con el INNER JOIN no dar el resultado correcto, Pero ¿cómo puedo solucionar esto? Necesito una consulta?
    • Podría ayudar a ver el SQL generado para el análisis. Pero de alguna manera, esta es una cuestión diferente. Tal vez la apertura de otra pregunta para este propósito sería mejor.
    • He Resuelto el problema. Necesito otra UNIRSE en mi consulta HQL: SELECCIONAR u DE Usuario u LEFT JOIN u.citas pas1 LEFT JOIN pas1.ranura en t, DONDE u.estado = 1 Y t.final <= :fecha1 O t.final ES NULO el FIN de «u».nombre asc Gracias por ayudar con la Solución. La sugerencia LEFT JOIN me ayuda mucho. THX
    • Bueno, me alegro de esta pequeña discusión ayudó a encontrar la solución. Bien hecho.

  2. 13

    Has echado un vistazo a tu SQL generado? Su método funciona muy bien aquí:

    // 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
    • esto funciona para mí
  3. 6
    // Hibernate query:
    const string hql = "from User u where u.Id = 101 and size(u.Appointments) = 0";
    • Un poco de explicación sería su respuesta aún mejor. 🙂
    • donde size() = 0 trabajado para mí, donde ESTÁ Vacía No era Compatible. Gracias!

Dejar respuesta

Please enter your comment!
Please enter your name here