我在用hibernate+struts+spring框架做项目的时候,执行一个查询的语句,结果到获得session的时候就是Unhandled Exception thrown: class java.lang.NullPointerException的异常,大家帮我看看是什么错误!!!谢谢啦,在线等!!!
以下是出错代码部分:
public void listByPage(final String hql, final PageResult pageResult) {
                
                super.getHibernateTemplate().executeFind(new HibernateCallback() (出错地方){                         public Object doInHibernate(Session s) throws HibernateException {
                                 if (null == hql) {
                                                return null;
                                        }
                                 Query query = s.createQuery(hql);
                                query.setFirstResult(pageResult.getFirstRec());
                                query.setMaxResults(pageResult.getPageSize());
                                List ret = query.list();
                                pageResult.setList(ret);                                String queryString = "";
                                if (hql.toUpperCase().indexOf("SELECT") != -1) {
                                        int i = query.getQueryString().toUpperCase()
                                                        .indexOf("FROM");
                                        queryString = "Select count(*) "
                                                        + hql.substring(i, hql.length());
                                } else {
                                        queryString = "Select count(*) " + hql;
                                }
                                // 去掉ORDER BY 的部分
                                int j = queryString.toUpperCase().lastIndexOf("ORDER");
                                if (j != -1) {
                                        queryString = queryString.substring(0, j);
                                }
                                Query cquery = s.createQuery(queryString);
                                cquery.setCacheable(true);
                                int recTotal = ((Integer) cquery.iterate().next()).intValue();
                                pageResult.setRecTotal(recTotal);
                                return null;
                        }                });        }

解决方案 »

  1.   

    我是在spring的配置文件里面配置的,那个里面配置过了,大家看看有没什么问题:
    <!-- DataSource -->
        <bean id="dataSource"
            class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
            <property name="driverClassName" 
            value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
            <property name="url" 
            value="jdbc:sqlserver://localhost:1433;DatabaseName=MyOffice;SelectMethod=cursor"/>
            <property name="username" value="sa"/>
            <property name="password" value="123456"/>
        </bean>    <!-- SessionFactory -->
        <bean id="sessionFactory"
            class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
            <property name="configLocation">
                <value>classpath:hibernate.cfg.xml</value>
            </property>
            <property name="dataSource">
            <ref local="dataSource"/>
            </property>
            <property name="hibernateProperties">
                <props>
                    <prop key="hibernate.dialect">
                        org.hibernate.dialect.SQLServerDialect
                    </prop>
                    <prop key="hibernate.show_sql">
                        true
                    </prop>
                </props>
            </property>
            <property name="mappingResources">
                <list>
                    <value>org/jb/y272/team4/entity/UserInfo.hbm.xml</value>
                    <value>org/jb/y272/team4/entity/FileInfo.hbm.xml</value>
                    <value>org/jb/y272/team4/entity/Schedule.hbm.xml</value>
                    <value>org/jb/y272/team4/entity/ReadCommonMessage.hbm.xml</value>
                    <value>org/jb/y272/team4/entity/ManualSign.hbm.xml</value>
                    <value>org/jb/y272/team4/entity/MyNote.hbm.xml</value>
                    <value>org/jb/y272/team4/entity/LoginLog.hbm.xml</value>
                    <value>org/jb/y272/team4/entity/DepartInfo.hbm.xml</value>
                    <value>org/jb/y272/team4/entity/Message.hbm.xml</value>
                    <value>org/jb/y272/team4/entity/OperateLog.hbm.xml</value>
                    <value>org/jb/y272/team4/entity/AccessoryFile.hbm.xml</value>
                    <value>org/jb/y272/team4/entity/BranchInfo.hbm.xml</value>
                    <value>org/jb/y272/team4/entity/FileTypeInfo.hbm.xml</value>
                    <value>org/jb/y272/team4/entity/MeetingInfo.hbm.xml</value>
                    <value>org/jb/y272/team4/entity/MessageToUser.hbm.xml</value>
                    <value>org/jb/y272/team4/entity/MessageType.hbm.xml</value>
                    <value>org/jb/y272/team4/entity/PreContract.hbm.xml</value>
                    <value>org/jb/y272/team4/entity/RoleInfo.hbm.xml</value>
                    <value>org/jb/y272/team4/entity/RoleRight.hbm.xml</value>
                    <value>org/jb/y272/team4/entity/Sysdiagrams.hbm.xml</value>
                    <value>org/jb/y272/team4/entity/SysFun.hbm.xml</value>
                    <value>org/jb/y272/team4/entity/UserState.hbm.xml</value>
                    <value>org/jb/y272/team4/entity/WorkTime.hbm.xml</value>
                    </list>
            </property>
        </bean>
            
        <bean id="myHibTxManager"
            class="org.springframework.orm.hibernate3.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory" />
        </bean>
        <tx:advice id="txAdvice" transaction-manager="myHibTxManager">
            <tx:attributes>
                <!-- 对get/load/search开头的方法要求只读事务 -->
                <tx:method name="get*" propagation="SUPPORTS" read-only="true" />
                <tx:method name="load*" propagation="SUPPORTS" read-only="true" />
                <tx:method name="search*" propagation="SUPPORTS" read-only="true" />
                <!-- 对其它方法要求事务 -->
                <tx:method name="*" propagation="REQUIRED" />    
            </tx:attributes >
        </tx:advice>
    <!--     <aop:config>-->
            <!-- 
            只对GoodsBiz添加事务支持,因为前面配置的transactionManager
             是专对Hibernate的事务管理器 。
            -->
        <!--    <aop:pointcut id="serviceMethods"  -->
        <!--        expression="execution(* org.jb.y272.team4.biz.*.*(..))" /> -->
        <!-- 织入 --> 
        <!--    <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods" /> -->
        <!--</aop:config> --> 
      

  2.   

    session不在你出错的这行,怎么得到session色?
    super.getHibernateTemplate()可能是个空的对象?
      

  3.   

    对啊,就说super.getHibernateTemplate()是个空的对象,然后抛出null的异常!!!那这个怎么解决啊???这是另一种做法才没出现session为空的错误,如果换另一种写法的时候就在那出错了,给你看下:
    /*
     * (非 Javadoc)
     * 
     * @see org.jb.common.dao.CommonDAO#listByPage(java.lang.String,
     *      org.jb.common.util.PageResult)
     * 
     * @SuppressWarnings("unchecked") public void listByPage(String hql,
     * PageResult pageResult) 
    { if (null==hql){ return ; }
             Query query = this.getSession().createQuery(hql);(这句就是出错的地方,提示说session为空,抛出空异常!)
     * query.setFirstResult(pageResult.getFirstRec());
     * query.setMaxResults(pageResult.getPageSize()); List ret = query.list();
     * pageResult.setList(ret);
     * 
     * String queryString = ""; if (hql.toUpperCase().indexOf("SELECT") != -1) {
     * int i = query.getQueryString().toUpperCase().indexOf("FROM"); queryString =
     * "Select count(*) " + hql.substring(i,hql.length()); } else { queryString =
     * "Select count(*) " + hql; } // 去掉ORDER BY 的部分 int j =
     * queryString.toUpperCase().lastIndexOf("ORDER"); if (j!=-1){ queryString =
     * queryString.substring(0, j); } Query cquery =
     * this.getSession().createQuery(queryString); cquery.setCacheable(true);
     * int recTotal = ((Integer)cquery.iterate().next()).intValue();
     * pageResult.setRecTotal(recTotal); }
     */