楼主最好这个List获取数据库值时候是在service里或者dao里面,然后在action里面获取list
这样将两处代码有效率分离出来,一是方便维护,二是良好性能

解决方案 »

  1.   

    假如说你只用到了hibernate的话,那么就用Iterator迭代这个List吧Iterator iterator=logs.iterator();
    while(iterator.hasNext())
    {
        System.out.println((ConsumeLogs)iterator.next());
    }此建议供楼主参考!
      

  2.   

    这段程序正常情况就一条sql,
    我的疑问
    1.你是如何监听sql的
    2.hql内容
    3.基础配置,尤其是加载,抓取方面
    4.有没有对象关联
      

  3.   

    顶4楼。毫无疑问,有延迟加载的情况。
    请贴出你的hql语句及ConsumeLogs的配置。
      

  4.   

    但是,为什么当我再循环logs,并得到log的属性时,程序会再次执行sql去查询数据库?  将___.hbm.xml文件中lazy属性设为false,懒加载只会在当你实际要用数据的时候才会执行相应的SQL语句,将数据放到SESSION缓存中,但是会执行11天SQL语句的话,那么你的HQL语句该贴出来,或者不看下那个batch属性的设置为多大?
    如果有关联有其他表/域的话,那么建议使用迫切左外连接,这样就改没有问题了
      

  5.   

    首先,谢谢楼上各位给的建议。
    我的ConsumeLogs就是一个独立的表,里面并没有关联关系。下面是我程序action中的一段代码String hql11 = "from ConsumeLogs c where c.adId =" + a.getId();
    List<ConsumeLogs> logs = consumeLogsService.getConsumeLogsByHql(hql11);//这方法是向服务层或者数据访问层传入一条sql。
    for (ConsumeLogs log : logs) {   //现在的疑问是,每当这个循环执行一次,就会去访问一次数据库。(因为我的myeclipse里一直打印sql)
    if (log.getPlayerType().trim().equals("click")) {
    System.out.println("number2=" + number2);
    number2++;
    } else {
    System.out.println("number=" + number);
    number++;
    }
    }<prop key="hibernate.jdbc.batch_size">30</prop>
    <prop key="hibernate.show_sql">true</prop>
    希望大伙能继续给予帮助,谢谢。
      

  6.   

    多看看Hibernate的延迟加载策略吧。你搜索出来的结果集只是些代理类对象,里面只有一些简单信息,但包括你记录的主键值。当你需要用这些对象的时候(调用getter或setter方法,或者其他),Hibernate才会去根据你记录的主键去实例化这个对象(根据主键从数据库里再搜索一遍)。
      

  7.   

    能把打印出来的sql贴出来吗,我很难想象这些sql是什么样子的,很难想象,因为是单表,难道去where id根本不可能这样去select
    因为它并不知道这些id
      

  8.   

    不错@~!楼主把hql语句贴出来看看就知道是什么问题了!~!
      

  9.   

    调用find的时候,会调用hibernate内部的session.createQuery(hql).list()方法而list方法,在没有配置二级查询缓存的时候,是直接去数据库获取数据如果配置了二级缓存的查询缓存,list会先去查询缓存寻找,找到了在根据缓存中的id,一条一条的去class缓存load,如果没有,就一条一条的去数据库中load