0

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

该组数据包括一对多字段。

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

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

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

示例:RED、GREEN、BLUE、Yellow(按颜色分隔)

这是一个成本很高的操作,因为它涉及到加入,因此如果有 1000 个产品,加载将需要很长时间。

OOT 问题。

对于 Criteria,我使用 list 函数。我设置了 ResultTransformer(Criteria.ROOT_ENTITY) 和 setMaxResult(5000)。

据我了解,这将检索 5000 条记录对其进行结果转换

但这意味着最后列出的记录将少于 5000 条。

我如何确保一分钟。5000 条记录?

例子

Criteria crit = getCriteria(Product.clas)
crit.setMaxResult(5000)
crit.ResultTransformer(Criteria.DISTINCT_ROOT_ENTITY )
4

1 回答 1

1
  1. 如果你想去掉 Join 中的重复行(包括 FetchType.eager),你需要使用

    Criteria.DISTINCT_ROOT_ENTITY 
    不是
    Criteria.ROOT_ENTITY
    使用 Criteria.ROOT_ENTITY,每行结果都是根实体的一个实例。

  2. 在大多数情况下,我更喜欢使用两个单独的查询。

第一个查询只有 Criteria.DISTINCT_ROOT_ENTITY 条件并返回 PK 值。

第二个查询从第一个查询的结果中选择具有 PK 分页或最大大小限制的结果。

// 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 之前应用。所以,我们需要第二次查询。

于 2012-07-19T04:33:52.167 回答