Java 优化批检索中的OneToMany FetchType.Edge和Criteria.ROOT\u实体

Java 优化批检索中的OneToMany FetchType.Edge和Criteria.ROOT\u实体,java,hibernate,Java,Hibernate,我有一个用户需求,要求我在数据树表中列出一组数据 数据集包括一对多字段 示例:产品有名称、类型和多种颜色 因此,它们的颜色存储在另一个表中(一对多关系) 用户希望datatable列出产品并将颜色作为字段之一 示例:红色、绿色、蓝色、黄色(按颜色分隔) 这是一个非常昂贵的操作,因为它涉及连接,因此如果有1000个产品,则需要很长时间才能加载 这个问题 对于条件,我使用列表函数。我设置了ResultTransformer(Criteria.ROOT_ENTITY)和setMaxResult(500

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

数据集包括一对多字段

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

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

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

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

这是一个非常昂贵的操作,因为它涉及连接,因此如果有1000个产品,则需要很长时间才能加载

这个问题

对于条件,我使用列表函数。我设置了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\u ROOT\u ENTITYNOT Criteria.ROOT\u ENTITY Criteria.DISTINCT_ROOT_ENTITY 对于Criteria.ROOT_实体,结果的每一行都是根实体的一个实例

  • 在大多数情况下,我更喜欢使用两个独立的查询

  • 第一个查询只有Criteria.DISTINCT\u ROOT\u实体的条件,并返回PK值

    第二个查询从第一个查询的结果中选择具有分页或最大大小限制(按PKs)的结果

    // 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();
    
    //第一次查询
    Criteria ct1=createCriteria(Product.class)
    .add(Restrictions.eq(“blah”,val))
    .setProjection(projects.id());
    .setResultTransformer(标准.DISTINCT\u ROOT\u实体)
    List pks=ct1.List();
    //第二个问题
    Criteria ct2=createCriteria(Product.class)
    .add(限制在(“id”,pks))
    .setFirstResult(000)
    .setMaxResult(000)
    返回ct2.list();
    

    重要的问题是我们不能在第一个查询中直接应用分页。因为分页选项setMaxResult或setFirstResult在Criteria.DISTINCT_ROOT_实体之前应用。因此,我们需要进行第二次查询。

    很抱歉,我使用了Criteria.DISTINCT\u ROOT\u实体。第二个查询通过第一个查询的主键值选择结果,分页或最大大小限制>>这是什么意思?@see第一个查询的结果是您的条件和条件下的主键。DISTINCT_ROOT_ENTITY。但不能直接在其中应用分页。因为分页选项setMaxResult或setFirstResult在Criteria.DISTINCT_ROOT_ENTITY之前应用,所以需要使用第二个查询来执行分页选项。我更新我的答案。请看一看。嗯,顺便问一下,你所说的分页+1是什么意思!我猜你的意思是,首先你得到5000个产品id,然后用这5000个产品id,你用一个in语句得到这些产品。。不幸的是,在oracle中,最多只允许1000个对象。@seeseeoops,在这种情况下,为什么不尝试这样做呢 Criteria.DISTINCT_ROOT_ENTITY