【发布时间】:2014-04-26 17:08:05
【问题描述】:
是否可以按所需顺序对每个组(每个父行的子行)的子行进行排序,并在 JPA 中获取每个组中所需数量的顶部行?
例如,我在 MySQL 数据库中有三个表。
- 类别
- 子类别
- 产品
这些表之间的关系很直观——按照它们出现的顺序是一对多的。
我正在sub_category 表上执行以下条件查询。
CriteriaBuilder criteriaBuilder=entityManager.getCriteriaBuilder();
CriteriaQuery<SubCategory>criteriaQuery=criteriaBuilder.createQuery(SubCategory.class);
EntityType<SubCategory> entityType = entityManager.getMetamodel().entity(SubCategory.class);
Root<SubCategory> root = criteriaQuery.from(entityType);
criteriaQuery.distinct(true);
Join<SubCategory, Category> catJoin = root.join(SubCategory_.catId, JoinType.INNER);
SetJoin<SubCategory, Product> prodJoin = root.join(SubCategory_.productSet, JoinType.INNER);
List<Predicate>predicates=new ArrayList<Predicate>();
predicates.add(criteriaBuilder.isTrue(root.get(SubCategory_.visible)));
predicates.add(criteriaBuilder.isTrue(catJoin.get(Category_.visible)));
predicates.add(criteriaBuilder.isTrue(prodJoin.get(Product_.visible)));
criteriaQuery.where(predicates.toArray(new Predicate[0]));
criteriaQuery.orderBy(criteriaBuilder.desc(root.get(SubCategory_.subCatId)));
List<SubCategory> list = entityManager.createQuery(criteriaQuery).getResultList();
此查询恰好获取所有这些表中visible(MySQL 中的TINYINT 映射到相应 JPA 实体中的 Boolean 属性)为 true 的所有子类别。
执行此查询后,每个子类别的一组产品将以Set<Product> 的形式提供。
对每个子类别的一组产品进行排序后,我想获取每个子类别的一组前五名产品(不是每个子类别的所有产品)按降序排列。
有可能吗?
我使用的是 EclipseLink 2.3.2 提供的 JPA 2.0。
【问题讨论】:
标签: mysql jpa eclipselink criteria greatest-n-per-group