mysql - 按所需顺序对每个组的子行进行排序,并在 JPA 中获取每个组中所需的顶部行数

标签 mysql jpa eclipselink criteria greatest-n-per-group

是否可以按所需顺序对每个组的子行(每个父行的子行)进行排序,并在 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 中限制联接或子查询的方法。如果您发现一些优雅的方法来做到这一点,请不要忘记将其发布在这里。

据我所知,你可以做一些不太有效的事情:

  1. 删除“加入”产品 - 仅检索类别和子类别。
  2. 使用单独的查询检索每个子类别的产品,并为每个“产品”查询指定 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/

相关文章:

java - 如何在Java中自动加载具有@ManyToMany关系的实体

php - 如何使用查询在mysql表中插入html代码

java - JDBC 在使用 LOAD DATA LOCAL INFILE 时是否有相对路径选项?

JPA:子对象的自动加载没有按预期工作

java - 实体的流动性是什么意思?

java - @Transactional(NEVER) 的可能用例是什么

java - 类似子句 JPQL 中的参数

mysql - Mysql(innodb)行级锁定是解决方案吗?

mysql - meta_query,如何同时使用OR和AND关系进行搜索?

java - Spring/Hibernate - 实体被隐式持久化