Java Hibernate sql查询处理速度比普通查询慢

Java Hibernate sql查询处理速度比普通查询慢,java,hibernate,postgresql,Java,Hibernate,Postgresql,我正在使用hibernate和Struts2。以前,我只使用Struts2和普通数据库查询Postgres。现在我正试图用hibernate修改我的数据库结构。但问题是,当我在hibernate中修改代码时,它的工作速度太慢了 public void evaluation() { try { String hql = "from OMRDetailsTable omrDetailsTable where omrDetailsTable.bar_code_no not in

我正在使用hibernate和Struts2。以前,我只使用Struts2和普通数据库查询Postgres。现在我正试图用hibernate修改我的数据库结构。但问题是,当我在hibernate中修改代码时,它的工作速度太慢了

  public void evaluation() {
    try {
      String hql = "from OMRDetailsTable omrDetailsTable where omrDetailsTable.bar_code_no not in(select roll_no from RejectListTable rejectListTable where rejectListTable.rej_status='R') and omrDetailsTable.roll_no not in(select roll_no from RejectListTable rejectListTable where rejectListTable.rej_status='R') and omrDetailsTable.omr_error in('T','U') order by omrDetailsTable.roll_no";
      Query query = session.createQuery(hql);
      query.setCacheable(false);
      query.setReadOnly(true);  

      List<OMRDetailsTable> result_1 = query.list();

      Iterator<OMRDetailsTable> iterator = result_1.iterator();
      while(iterator.hasNext()){
        omrDetailsTable  = (OMRDetailsTable) iterator.next();   
        set_no = omrDetailsTable.getSet_no().toString();
        String queryques = "from SetWiseQuesDetailTable setWiseQuesDetailTable where setWiseQuesDetailTable.set_nm='A' order by setWiseQuesDetailTable.sl_no";

        Query query1 = session.createQuery(queryques);
        List<String> ansDetailsList = new ArrayList<String>();
        ansDetailsList.add(omrDetailsTable.getSl_no());
        ansDetailsList.add(omrDetailsTable.getBar_code_no());
        ansDetailsList.add(omrDetailsTable.getRoll_no());
        ansDetailsList.add(set_no)

        List<SetWiseQuesDetailTable> result_2 = query1.list();

        for(SetWiseQuesDetailTable setDetails : result_2) {
          System.out.println("Inner loop"+setDetails);
        }        
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
}
我使用上述函数从数据库中获取数据。我在没有hibernate的情况下使用了相同的方法,该方法比上面的代码运行得更快

我的hibernate配置文件:

<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">org.postgresql.Driver</property>
<property name="connection.url">jdbc:postgresql://localhost:5432/database</property>
<property name="connection.username">postgres</property>
<property name="connection.password">postgres</property>

<property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<mapping class="com.templateproject.table.LoginTable" />
<mapping class="com.templateproject.table.OMRDetailsTable" />
<mapping class="com.templateproject.table.RejectListTable" />
<mapping class="com.templateproject.table.SetWiseQuesDetailTable" />
</session-factory>
</hibernate-configuration>      
工作缓慢的原因是什么

额外信息:OMRDetailsTable有15000条记录,SetWiseQuesDetailTable有300条记录。意味着它将迭代4500000次


如何在Hibernate中转换上述子查询?我是新加入hibernate的。

这段代码每次都在内部循环中执行相同的查询。它不依赖于外部查询的结果。这会使我怀疑您没有正确迁移所有内容。如果您只是在开始时执行查询,然后编写嵌套循环,那么这段代码将得到相同的结果。第二个查询每次加载数据库中的所有匹配记录,而不是与外部循环中正在处理的条目相对应的某个子集

但是,您还应该知道,hibernate可能会添加额外的连接以加载其表可能未包含在原始SQL中的其他实体。Yourconfig已启用查询日志记录。联接中是否有其他表?我已经看到这些额外的连接以及后续的延迟加载操作会导致性能下降,其系数为1000


Hibernate使用反射,它比编译代码慢,但我不考虑这个,直到我确定我的代码在功能上是等效的。

你能告诉我我的代码有什么错误吗?这个查询字符串queryques=from SetWiseQuesDetailTable SetWiseQuesDetailTable where SetWiseQuesDetailTable.set_nm='A'order by SetWiseQuesDetailTable.sl_no;没有参数。这意味着它总是返回相同的结果。要多次执行此查询,或者在您的情况下,快速连续执行15k次几乎肯定是一个错误。OMRDetailsTable实体和SetWiseQuesDetailTable条目之间的关系是什么?第二个查询上不应该有一个连接或过滤器,它根据当前OMRDetailsTable进行限制吗?Nathan是对的,您的内部查询每次都是相同的,并且每次循环迭代时都会执行。因此,您可能会看到相同的内部循环:在每个外部对象的结果页面中。你还应该确保你的陈述符合逻辑顺序。定义内部查询,然后编写一些无关的输出,然后运行并打印内部查询。让它更有条理。您还需要处理变量的名称。