执行多个hibernate依赖项条件

执行多个hibernate依赖项条件,hibernate,hibernate-criteria,Hibernate,Hibernate Criteria,首先,我对hibernate非常陌生,所以我不知道如何使用多个标准 基本上我有两个标准 带子查询的第一个条件,我定义此条件如下: DetachedCriteria subCriteria = DetachedCriteria.forClass(RejectListTable.class, "rejectTable"); subCriteria.add(Restrictions.like("rejectTable.rej_status", "R")); subCriteri

首先,我对hibernate非常陌生,所以我不知道如何使用多个标准

基本上我有两个标准

带子查询的第一个条件,我定义此条件如下:

DetachedCriteria subCriteria = DetachedCriteria.forClass(RejectListTable.class, "rejectTable");
      subCriteria.add(Restrictions.like("rejectTable.rej_status", "R"));
      subCriteria.setProjection(Projections.property("rejectTable.roll_no"));
      //      subCriteria.setProjection(Projections.property("rejectTable.error_type"));

      String[] omrErrorsList = { "T", "U" };
      Criteria outerCriteria = session.createCriteria(OMRDetailsTable.class, "omrDetails");
      outerCriteria.add(Restrictions.in("omrDetails.omr_error", omrErrorsList));
      outerCriteria.add(Subqueries.notIn("omrDetails.roll_no", subCriteria));      

      List outerResults = outerCriteria.list();  
第二个标准:

Criteria innerCriteria = session.createCriteria(SetWiseQuesDetailTable.class, "setWiseQuesDetailTable");
        innerCriteria.add(Restrictions.like("setWiseQuesDetailTable.set_nm", "A"));
        List innerResults = innerCriteria.list();
在第二个标准“setWiseQuesDetailTable.set_nm”中,该值来自第一个标准。这意味着第二个标准取决于第一个标准数据

现在在第二个条件“setWiseQuesDetailTable.set_nm”中设置静态值“A”,但实际上它来自第一个条件

所以我的问题是如何做到这一点

我已经尝试使用上述两个标准,如下所示,这是工作缓慢

  DetachedCriteria subCriteria = DetachedCriteria.forClass(RejectListTable.class, "rejectTable");
  subCriteria.add(Restrictions.like("rejectTable.rej_status", "R"));
  subCriteria.setProjection(Projections.property("rejectTable.roll_no"));
  //         subCriteria.setProjection(Projections.property("rejectTable.error_type"));

  String[] omrErrorsList = { "T", "U" };
  Criteria outerCriteria = session.createCriteria(OMRDetailsTable.class, "omrDetails");
  outerCriteria.add(Restrictions.in("omrDetails.omr_error", omrErrorsList));
  outerCriteria.add(Subqueries.notIn("omrDetails.roll_no", subCriteria));  
  outerCriteria.addOrder(Order.asc("omrDetails.bar_code_no"));

  List outerResults = outerCriteria.list();  
  Iterator<OMRDetailsTable> outerIterator = outerResults.iterator();


  System.out.println(outerResults.size());
  Criteria innerCriteria = session.createCriteria(SetWiseQuesDetailTable.class, "setWiseQuesDetailTable");

  while(outerIterator.hasNext()){
    System.out.println("Outer Loop"+outerIterator.next().getBar_code_no());  
    innerCriteria.add(Restrictions.like("setWiseQuesDetailTable.set_nm", "A"));
    List innerResults = innerCriteria.list(); 
    Iterator<SetWiseQuesDetailTable> innerIterator = innerResults.iterator();
    while(innerIterator.hasNext()) {
      System.out.println("Inner loop"+innerIterator.next().getSet_nm());
    }  

    System.out.println("Outer Loop");
  }
DetachedCriteria子标准=DetachedCriteria.forClass(RejectListTable.class,“rejectTable”);
次标准。添加(限制,如(“拒绝表。rej_状态”,“R”));
次标准.setProjection(Projections.property(“Rejectable.roll_no”);
//次标准.setProjection(Projections.property(“Rejectable.error_type”);
字符串[]omrErrorsList={“T”,“U”};
Criteria outerCriteria=session.createCriteria(OMRDetailsTable.class,“omrDetails”);
add(Restrictions.in(“omrDetails.omr_error”,omrErrorsList));
add(subquerys.notIn(“omrDetails.roll_no”,subCriteria));
outerCriteria.addOrder(Order.asc(“omrDetails.bar\u code\u no”);
List outerResults=outerCriteria.List();
迭代器outiterator=outerResults.Iterator();
System.out.println(outerResults.size());
Criteria innerCriteria=session.createCriteria(SetWiseQuesDetailTable.class,“SetWiseQuesDetailTable”);
while(outerIterator.hasNext()){
System.out.println(“外循环”+outiterator.next().getBar_code_no());
innerCriteria.add(Restrictions.like(“setwisequesdetailable.set_nm”,“A”));
List innerResults=innerCriteria.List();
迭代器innerIterator=innerResults.Iterator();
while(innerIterator.hasNext()){
System.out.println(“内部循环”+innerIterator.next().getSet_nm());
}  
System.out.println(“外环”);
}

如何提高性能?

如果您还没有这样做,请查看生成的sql(了解如何为此设置日志记录参数),这可能会给出提示。我已尝试使用标准。。。正如你所看到的,我的尝试是成功的。我尝试的工作很好,但问题是工作缓慢。我不明白为什么它工作得慢。能告诉我我错过了什么吗?对不起,我应该读得更清楚你的问题;当代码中的问题不明显时,查看Hibernate生成的sql可能会有所帮助,但在您的情况下,Hibernate似乎正在进行查询,然后针对每个结果进行另一个查询(循环中的innerCriteria.list()。相反,您应该尝试通过一个查询获得所有结果(以便在Hibernate生成的sql中可以看到连接)。