ORDER BY 使用 Criteria API

Posted

技术标签:

【中文标题】ORDER BY 使用 Criteria API【英文标题】:ORDER BY using Criteria API 【发布时间】:2010-12-19 07:17:46 【问题描述】:

当我编写 HQL 查询时

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

一切都很好。但是,当我写一个标准时

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

我得到一个异常org.hibernate.QueryException: could not resolve property: kind.value of: my.sample.data.entities.Cat

如果我想使用 Criteria and Order,我应该如何表达我的“order by”?

【问题讨论】:

您的 Cat 类及其映射是什么样的? 【参考方案1】:

如果没有看到映射很难确定(参见@Juha 的评论),但我认为您想要类似以下内容:

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

【讨论】:

【参考方案2】:

您需要为mother.kind 创建一个别名。你这样做是这样的。

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

【讨论】:

session.createCriteria 已弃用 我使用的是 Hibernate 5.0.7 并且 session.createCriteria 未被弃用。【参考方案3】:

您也可以添加连接类型:

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

【讨论】:

【参考方案4】:

这是你必须做的,因为 sess.createCriteria 已被弃用:

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();

【讨论】:

找到适合Hibernate 5.2的。【参考方案5】:

对于 Hibernate 5.2 及更高版本,请使用CriteriaBuilder,如下所示

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();

【讨论】:

以上是关于ORDER BY 使用 Criteria API的主要内容,如果未能解决你的问题,请参考以下文章

在 JPA Criteria API 的子查询中使用 ORDER BY 的替代方法是啥?

Mybatis使用Criteria标准查询数据库没有order by排序方法时,使用Java的Collections.sort()进行排序

Mybatis使用Criteria标准查询数据库没有order by排序方法时,使用Java的Collections.sort()进行排序

Hibernate Criteria order by term length

休眠 2 与 MSSQL 用于 ORDER BY

Hibernate Group by Criteria Object