Tengo las siguientes clases:

class User {
  hasMany = [ratings: Rating] 
} 

class Item {
 hasMany = [ratings: Rating]
}

class Rating {
 belongsTo = [user: User, item: Item]
}

Quiero contar los distintos usuarios que calificaron en un elemento.

La siguiente no funciona:

select count(distinct(r.user)) from Rating as r
        where r.item=:item
        group by r.user

¿Cómo tengo que modificar la consulta HQL para que funcione?

OriginalEl autor confile | 2013-09-13

3 Comentarios

  1. 32

    Tu consulta debería funcionar como se esperaba con una modificación menor en la forma de utilizar los distinct:

    select count(distinct r.user) from Rating as r 
    where r.item = :item group by r.user

    Otro, pero más prolongada manera, de hacer esta consulta es mediante el uso de User y join:

    select count(distinct u) from User as u 
    inner join u.ratings as r where r.item = :item
    group by r.user
    Por qué no se acepta?
    Es realmente extraño que el extra paréntesis dentro de la cuenta en las distintas hacer fallar con un error de sintaxis. Esta es la manera correcta de solucionar. Sin duda me salvó un montón de tiempo.

    OriginalEl autor dmahapatro

  2. 0

    Esto es cómo hacerlo en modo de Hibernación Criterios

    Criteria crit = session.createCriteria(Rating.class)
    .add(Restrictions.like("item", item)
    .addOrder(Order.asc("user"))
    .setProjection(
           Projections.distinct(Projections.projectionList()
                            .add(Projections.property("user"), "user")))
    .setResultTransformer(Transformers.aliasToBean(Rating.class));
    Cómo puedo hacer que con HQL?
    select distinct r.de usuario de Calificación r, donde r.item=:elemento grupo por r.usuario; a Continuación, hacer un tamaño de()?
    es allí una manera de hacerlo en una consulta?
    Es inneficient hacerlo de esa manera, ya que usted será listado de cada grabar sólo para ver cómo muchos de ellos están presentes. Para una mejor ejemplo del uso de criterios, por favor, consulte stackoverflow.com/questions/22164717/…
    Tenga en cuenta que los criterios de la API tiene una de las Proyecciones.countDistinct(). Si el uso que se le dará al comportamiento correcto con mucho menos código. Creo que se puede utilizar crit.a setprojection(Proyecciones.countDistinct(«usuario»));

    OriginalEl autor aksappy

  3. 0

    Simplemente ejecutar la consulta dentro de una transacción.

    Transaction tx=session.beginTransaction;
    //Run your query here
    tx.commit();

    El problema surge debido a hibernar el almacenamiento en caché.

    OriginalEl autor coding_idiot

Dejar respuesta

Please enter your comment!
Please enter your name here