我有一个用户要求,要求我在数据树表中列出一组数据。

数据集包括一对多字段。

示例:产品具有名称,类型和多种颜色。

因此它们的颜色存储在另一个表中(一对多关系)

用户希望数据表列出产品并将颜色包括为字段之一

示例:红色,绿色,蓝色,黄色(按颜色分隔)

这是一项非常昂贵的操作,因为它涉及连接,因此,如果有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 
NOT
Criteria.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之前应用。因此,我们需要第二次查询。

    关于java - 在批处理和Criteria.ROOT_ENTITY中优化OneToMany FetchType.Edge,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11553293/

    10-13 03:36