java - Hibernate Criteria 按子记录数排序

标签 java hibernate

我有两个类:新闻和评论,它们之间存在一对多关联。 我正在使用 Hibernate Criteria 从数据库中获取新闻。我希望我的新闻按其评论数排序。

session.createCriteria(News.class, "n");
criteria.createAlias("n.comments", "comments");
criteria.setProjection(Projections.projectionList()
    .add(Projections.groupProperty("comments.id"))
    .add(Projections.count("comments.id").as("numberOfComments")));
criteria.addOrder(Order.desc("numberOfComments"));
List<News> news = criteria.list();

使用以下代码,我得到的不是新闻列表,而是每个对象中都有两个 Long 的对象列表。 我应该怎么做才能获得已排序的新闻对象列表?

最佳答案

我在这里找到了问题的答案: Hibernate Criteria API - how to order by collection size?

我添加了新的 hibernate Order 实现:

public class SizeOrder extends Order {

protected String propertyName;
protected boolean ascending;

protected SizeOrder(String propertyName, boolean ascending) {
    super(propertyName, ascending);
    this.propertyName = propertyName;
    this.ascending = ascending;
}

public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
    String role = criteriaQuery.getEntityName(criteria, propertyName) + '.' + criteriaQuery.getPropertyName(propertyName);
    QueryableCollection cp = (QueryableCollection) criteriaQuery.getFactory().getCollectionPersister(role);

    String[] fk = cp.getKeyColumnNames();
    String[] pk = ((Loadable) cp.getOwnerEntityPersister())
            .getIdentifierColumnNames();
    return " (select count(*) from " + cp.getTableName() + " where "
            + new ConditionFragment()
                    .setTableAlias(
                            criteriaQuery.getSQLAlias(criteria, propertyName)
                    ).setCondition(pk, fk)
                .toFragmentString() + ") "
            + (ascending ? "asc" : "desc");
}

public static SizeOrder asc(String propertyName) {
    return new SizeOrder(propertyName, true);
}
public static SizeOrder desc(String propertyName) {
    return new SizeOrder(propertyName, false);
}
}

然后将其应用到我的标准中作为

criteria.addOrder(SizeOrder.desc("n.comments"));

现在一切正常, 非常感谢大家:)

关于java - Hibernate Criteria 按子记录数排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31855253/

相关文章:

java - 在java中获取google存储桶的大小

java - 加入三个深度表时为"MultipleBagFetchException: cannot simultaneously fetch multiple bags"

java - PersistenceContext 没有注入(inject) EntityManager

Java STS机制异常

javascript - 如何根据用户输入修改 &lt;textarea&gt; html 值

java - 如何将外部供应商 SSL 证书配置到 JBoss 7.1 中

java - Java keystore 的证书

java - 替代已弃用的 setParameter(String name, Object val, Type type)

java - Spring Data REST + JPA 从 OneToMany 集合中删除 [不是所有者端]

hibernate hql 与WITH 和WHERE 之间的不同