首页 > 解决方案 > 在 JPA Criteria API 中实现行索引功能

问题描述

所以我有以下情况:两个联合实体,Offer 和 Item,我想在其中获取部分并将它们放入这样的元组对象中:

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
Metamodel m = entityManager.getMetamodel();
EntityType<Offer> offerMeta = m.entity(Offer.class);

CriteriaQuery<MyTupleContainer> criteriaQuery = criteriaBuilder.createQuery(MyTupleContainer.class);
Root<Offer> offer = criteriaQuery.from(Offer.class);
Join<Offer, Item> item = offer.join(offerMeta.getSingularAttribute("item", Item.class));

criteriaQuery.multiselect(offer.get("id"), item.get("name"), offer.get("offerValidUntil"),
item.get("regularPrice"), offer.get("discountInPercent"));

之后,应用过滤、排序和分页(数据显示在表格中)。

这可以正常工作,但是我还想在默认排序且不应用过滤/分页时获取每个元素的索引!具体来说,默认顺序是 by offer.get("offerValidUntil"),升序。因此,如果我的数据库表有 100 个条目,我希望它们在查询执行时动态获取 1 到 100 的索引,并且应该在之后应用自定义排序/过滤/分页(因为显然如果之后完成它会弄乱正确的映射)。

ROW_NUMBER我有一个有效的 SQL 查询,它在Oracle 窗口函数的帮助下完成了它应该做的事情:

SELECT Offer.id AS id, 
 Item.name AS name,
 Offer.offer_valid_until AS offerValidUntil,
 Item.regular_price AS regularPrice,
 Offer.discount_in_percent AS discountInPercent
 ROW_NUMBER() OVER (PARTITION BY 1 ORDER BY Offer.offer_valid_until ASC) AS listIndex
 FROM Offer LEFT JOIN Item ON Item.id = Offer.item_id

使用 Criteria API 的最佳方法是什么?

提前致谢!

标签: javasqljpacriteria-api

解决方案


推荐阅读