Wenn ich eine HQL-Abfrage schreibe
Query q = session.createQuery("SELECT cat from Cat as cat ORDER BY cat.mother.kind.value");
return q.list();
Alles ist gut. Wenn ich jedoch ein Kriterium schreibe
Criteria c = session.createCriteria(Cat.class);
c.addOrder(Order.asc("mother.kind.value"));
return c.list();
Ich bekomme eine Ausnahme org.hibernate.QueryException: could not resolve property: kind.value of: my.sample.data.entities.Cat
Wenn ich Kriterien und Reihenfolge verwenden möchte, wie soll ich meine "Bestellung bis" ausdrücken?
java
hibernate
sql-order-by
hql
Niklassaer
quelle
quelle
Antworten:
Sie müssen einen Alias für das erstellen
mother.kind
. Du machst das so.Criteria c = session.createCriteria(Cat.class); c.createAlias("mother.kind", "motherKind"); c.addOrder(Order.asc("motherKind.value")); return c.list();
quelle
session.createCriteria
nicht veraltet.Es ist schwer sicher zu wissen, ohne die Zuordnungen zu sehen (siehe @ Juhas Kommentar), aber ich denke, Sie möchten so etwas wie das Folgende:
Criteria c = session.createCriteria(Cat.class); Criteria c2 = c.createCriteria("mother"); Criteria c3 = c2.createCriteria("kind"); c3.addOrder(Order.asc("value")); return c.list();
quelle
Dies müssen Sie tun, da sess.createCriteria veraltet ist:
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();
quelle
Hibernate 5.2
.Sie können auch den Join-Typ hinzufügen:
Criteria c2 = c.createCriteria("mother", "mother", CriteriaSpecification.LEFT_JOIN); Criteria c3 = c2.createCriteria("kind", "kind", CriteriaSpecification.LEFT_JOIN);
quelle
Verwenden Sie für den Ruhezustand 5.2 und höher
CriteriaBuilder
FolgendesCriteriaBuilder 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();
quelle