Java 优化批检索中的OneToMany FetchType.Edge和Criteria.ROOT\u实体
我有一个用户需求,要求我在数据树表中列出一组数据 数据集包括一对多字段 示例:产品有名称、类型和多种颜色 因此,它们的颜色存储在另一个表中(一对多关系) 用户希望datatable列出产品并将颜色作为字段之一 示例:红色、绿色、蓝色、黄色(按颜色分隔) 这是一个非常昂贵的操作,因为它涉及连接,因此如果有1000个产品,则需要很长时间才能加载 这个问题 对于条件,我使用列表函数。我设置了ResultTransformer(Criteria.ROOT_ENTITY)和setMaxResult(5000) 据我所知,这将检索5000条记录并对其进行结果转换 但这意味着我最后列出的记录将少于5000条 如何确保至少有5000条记录 范例Java 优化批检索中的OneToMany FetchType.Edge和Criteria.ROOT\u实体,java,hibernate,Java,Hibernate,我有一个用户需求,要求我在数据树表中列出一组数据 数据集包括一对多字段 示例:产品有名称、类型和多种颜色 因此,它们的颜色存储在另一个表中(一对多关系) 用户希望datatable列出产品并将颜色作为字段之一 示例:红色、绿色、蓝色、黄色(按颜色分隔) 这是一个非常昂贵的操作,因为它涉及连接,因此如果有1000个产品,则需要很长时间才能加载 这个问题 对于条件,我使用列表函数。我设置了ResultTransformer(Criteria.ROOT_ENTITY)和setMaxResult(500
Criteria crit = getCriteria(Product.clas)
crit.setMaxResult(5000)
crit.ResultTransformer(Criteria.DISTINCT_ROOT_ENTITY )
// 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