Cuando escribo una consulta HQL

Query q = session.createQuery("SELECT cat from Cat as cat ORDER BY cat.mother.kind.value");
return q.list();

Todo está bien. Sin embargo, cuando escribo un Criterio

Criteria c = session.createCriteria(Cat.class);
c.addOrder(Order.asc("mother.kind.value"));
return c.list();

Puedo obtener una excepción org.hibernate.QueryException: could not resolve property: kind.value of: my.sample.data.entities.Cat

Si quiero usar los Criterios y el Orden, ¿cómo debo expresar mi «orden»?

  • ¿Qué hace tu Gato clase y su asignación parece?
InformationsquelleAutor niklassaers | 2009-11-22

5 Comentarios

  1. 104

    Usted necesita para crear un alias para el mother.kind. De hacerlo así.

    Criteria c = session.createCriteria(Cat.class);
    c.createAlias("mother.kind", "motherKind");
    c.addOrder(Order.asc("motherKind.value"));
    return c.list();
    • período de sesiones.createCriteria está en desuso
    • Estoy usando Hibernate 5.0.7 y session.createCriteria no es obsoleto.
  2. 8

    Es difícil saber con certeza sin ver las asignaciones (ver @Juha del comentario), pero creo que quieres algo como el siguiente:

    Criteria c = session.createCriteria(Cat.class);
    Criteria c2 = c.createCriteria("mother");
    Criteria c3 = c2.createCriteria("kind");
    c3.addOrder(Order.asc("value"));
    return c.list();
  3. 5

    Puede agregar un tipo de combinación así:

    Criteria c2 = c.createCriteria("mother", "mother", CriteriaSpecification.LEFT_JOIN);
    Criteria c3 = c2.createCriteria("kind", "kind", CriteriaSpecification.LEFT_JOIN);
  4. 5

    Esto es lo que tienes que hacer desde sess.createCriteria está en desuso:

    CriteriaBuilder builder = getSession().getCriteriaBuilder();
    CriteriaQuery<User> q = builder.createQuery(User.class);
    Root<User> usr = q.from(User.class);
    ParameterExpression<String> p = builder.parameter(String.class);
    q.select(usr).where(builder.like(usr.get("name"),p))
      .orderBy(builder.asc(usr.get("name")));
    TypedQuery<User> query = getSession().createQuery(q);
    query.setParameter(p, "%" + Main.filterName + "%");
    List<User> list = query.getResultList();
    • Encontrar este apropiados para Hibernate 5.2.
  5. 0

    Para Hibernar 5.2 y por encima, el uso de CriteriaBuilder como sigue

    CriteriaBuilder builder = sessionFactory.getCriteriaBuilder();
    CriteriaQuery<Cat> query = builder.createQuery(Cat.class);
    Root<Cat> rootCat = query.from(Cat.class);
    Join<Cat,Mother> joinMother = rootCat.join("mother");  //<-attribute name
    Join<Mother,Kind> joinMotherKind = joinMother.join("kind");
    query.select(rootCat).orderBy(builder.asc(joinMotherKind.get("value")));
    Query<Cat> q = sessionFactory.getCurrentSession().createQuery(query);
    List<Cat> cats = q.getResultList();

Dejar respuesta

Please enter your comment!
Please enter your name here