如何告诉 JPA CriteriaBuilder 按返回的唯一数据列排序?

Posted

技术标签:

【中文标题】如何告诉 JPA CriteriaBuilder 按返回的唯一数据列排序?【英文标题】:How do I tell JPA CriteriaBuilder to order by the only column of data returned? 【发布时间】:2014-11-11 16:15:12 【问题描述】:

我正在使用 JPA 2.1 和 Hibernate 4.3.6.Final (mysql 5.5)。在我的 JPA CriteriaBuilder 查询中,我返回的唯一列是最终计算结果为整数的表达式。但是,我如何告诉 JPA 仅根据第一列对结果进行排序?我有……

    final CriteriaBuilder builder = m_entityManager.getCriteriaBuilder();
    final CriteriaQuery<Integer> criteria = builder.createQuery(Integer.class);
    final Root<User> user = criteria.from(User.class);
    criteria.where(builder.and(builder.like(user.get(User_.userName), userNamePrefix + "%"),
                               builder.equal(user.get(User_.url), url)));

    criteria.select( builder.substring(user.get(User_.userName), userNamePrefix.length()).as(Integer.class) );
    criteria.orderBy( ??? );

我在“???”中输入了什么告诉 JPA 对返回的唯一数据列进行排序?我意识到我可以获取所有列并使用 Java 进行排序,但我现在想避免这种情况。

谢谢,- 戴夫

【问题讨论】:

【参考方案1】:

类似

Expression selectedExpr = builder.substring(user.get(User_.userName);
criteria.select(selectedExpr, userNamePrefix.length()).as(Integer.class));
Order orderExpr = builder.asc(selectedExpr);
criteria.orderBy(orderExpr);

【讨论】:

【参考方案2】:

我最终使用 criteriaBuilder 为我构建了一个 Order 对象。即

criteria.orderBy(builder.asc(user.get(User_.userNmae)));

类似的问题和更详细的答案:JPA criteria query, order on class

【讨论】:

以上是关于如何告诉 JPA CriteriaBuilder 按返回的唯一数据列排序?的主要内容,如果未能解决你的问题,请参考以下文章

JPA / Hibernate:CriteriaBuilder - 如何使用关系对象创建查询?

如何在 JPA Criteriabuilder Select 语句中执行子查询?

JPA CriteriaBuilder - 如何使用“IN”比较运算符

java-jpa-criteriaBuilder使用入门

真正动态的 JPA CriteriaBuilder

JPA CriteriaBuilder 中的自定义表达式