在批处理和Criteria.ROOT_ENTITY中优化OneToMany FetchType.Edge
编程 65
我有一个用户要求,要求我在数据树表中列出一组数据。
数据集包括一对多字段。
示例:产品具有名称,类型和多种颜色。
因此它们的颜色存储在另一个表中(一对多关系)
用户希望数据表列出产品并将颜色包括为字段之一
示例:红色,绿色,蓝色,黄色(按颜色分隔)
这是一项非常昂贵的操作,因为它涉及连接,因此,如果有1000个产品,则将需要很长时间来加载。
OOT问题。
对于条件,我使用列表功能。然后设置ResultTransformer(Criteria.ROOT_ENTITY)和setMaxResult(5000)。
据我了解,这将检索5000条记录并对其进行结果转换
但这意味着最后列出的记录少于5000条。
我如何确保最低限度。 5000条记录?
例
Criteria crit = getCriteria(Product.clas)
crit.setMaxResult(5000)
crit.ResultTransformer(Criteria.DISTINCT_ROOT_ENTITY )
-
如果要消除Join中的重复行(包括FetchType.eager),则需要使用
Criteria.DISTINCT_ROOT_ENTITY
NOTCriteria.ROOT_ENTITY
With Criteria.ROOT_ENTITY, each row of results is an instance of the root entity.In most of cases, I prefer to use two separated queries.
First query has only conditions with Criteria.DISTINCT_ROOT_ENTITY and returns PK values.
Second query select results with pagination or max size limits by PKs from the first query's result.
// First Query Criteria ct1 = createCriteria(Product.class) .add( Restrictions.eq("blah", val) ) .setProjection(Projections.id()); .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) List<Integer> pks = ct1.list(); // Second Query Criteria ct2 = createCriteria(Product.class) .add( Restrictions.in("id", pks) ) .setFirstResult(000) .setMaxResult(000) return ct2.list();
重要的问题是我们不能在第一次查询中直接应用分页。因为分页选项setMaxResult或setFirstResult在Criteria.DISTINCT_ROOT_ENTITY之前应用。因此,我们需要第二次查询。2025-04-13 15:07:05