gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 01:58:09 25 4
gpt4 key购买 nike

是否可以按所需顺序对每个组的子行(每个父行的子行)进行排序,并在 JPA 中获取每个组中所需数量的顶部行?

比如我在MySQL数据库中有3张表。

  • 类别
  • 子类别
  • 产品

这些表之间的关系很直观 - 按照它们出现的顺序是一对多的。

我正在 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 属性)在所有这些表中都是正确的。

执行此查询后,每个子类别的一组产品将作为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com