我有一个用户要求,要求我在数据树表中列出一组数据。
数据集包括一对多字段。
示例:产品具有名称,类型和多种颜色。
因此它们的颜色存储在另一个表中(一对多关系)
用户希望数据表列出产品并将颜色包括为字段之一
示例:红色,绿色,蓝色,黄色(按颜色分隔)
这是一项非常昂贵的操作,因为它涉及连接,因此,如果有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_ENTITYNOT
Criteria.ROOT_ENTITYWith 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之前应用。因此,我们需要第二次查询。
关于java - 在批处理和Criteria.ROOT_ENTITY中优化OneToMany FetchType.Edge,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11553293/