Hibernate Criteria按子记录的数量排序
我有两个课程:新闻和评论,他们之间有一对多的关联。 我正在使用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 = criteria.list();
使用下面的代码,我得到的不是新闻列表,而是每个都有两个Long的对象列表。 如何获取已排序的新闻对象列表?
我在这里找到了我的问题的答案: Hibernate Criteria API – 如何按集合大小排序?
我添加了新的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"));
现在一切正常,非常感谢大家:)
- 如何使用带有Oracle 10g方言的Hibernate使用JPA生成我的id?
- java.lang.ClassCastException:oracle.sql.CLOB无法强制转换为oracle.sql.CLOB
- Hibernate可以使用MySQL的“ON DUPLICATE KEY UPDATE”语法吗?
- 如何在运行时覆盖FetchType.EAGER延迟
- 创建JUnit测试时没有此类方法错误
- 如果没有活动事务,Spring Hibernate集成抛出getFlushMode无效
- spring数据jpa和hibernate分离的实体传递给ManyToMany关系持久化
- H2数据库在内存中 – 通过Spring / Hibernate的Init模式
- 如何在数据库中通过Spring Hibernate在TextBox中插入Gujarati?