是否可以按所需顺序对每个组的子行(每个父行的子行)进行排序,并在 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。
最佳答案
我不熟悉在 JPA 中限制联接或子查询的方法。如果您发现一些优雅的方法来做到这一点,请不要忘记将其发布在这里。
据我所知,你可以做一些不太有效的事情:
- 删除“加入”产品 - 仅检索类别和子类别。
- 使用单独的查询检索每个子类别的产品,并为每个“产品”查询指定 setMaxResults(5)。
另一种可能性是使用 native 查询。这会更有效,但填充实体 bean 会很乏味。以下是获取每个子类别前 5 名产品的示例:
select * from category c
inner join sub_category cn on cn.category_id = c.id
inner join product p1 on p1.sub_category_id = cn.id and p1.id in
(select tmp.id from (select p.id, row_number() over (partition by p.sub_category order by p.id) as rn from product p where p.visible = 1) tmp
where tmp.rn < 6);
(显然,查询需要一些调整才能使其正常工作)
关于mysql - 按所需顺序对每个组的子行进行排序,并在 JPA 中获取每个组中所需的顶部行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22523074/