我的程序中,出现java.sql.SQLException: ORA-01008: 并非所有变量都已关联,这是什么原因呀?

解决方案 »

  1.   

    把java代码中出错的语句贴出来,还有java代码里的sql
      

  2.   

    代码贴出来看看呀估计是用PreparedStatment的时候,变量没有和SQL语句中的问号绑定,或者是绑定的数量不对
      

  3.   

    为了实现单步调试,我在applicationContext.xml加了一行代码(<prop key="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</prop>),我把它去掉就可以运行了。具体什么原因我还不是很清楚,applicationContext.xml的配置如下:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
        "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans>
      <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName">
          <value>oracle.jdbc.driver.OracleDriver</value>
        </property>
        <property name="url">
          <value>jdbc:oracle:thin:@192.168.10.4:1521:surge</value>
        </property>
        <property name="username">
          <value>op</value>
        </property>
        <property name="password">
          <value>op</value>
        </property>
      </bean>
      <bean id="hibernateProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
        <property name="properties">
          <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
        <prop key="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</prop>
            <prop key="hibernate.query.substitutions">true 1, false 0</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.c3p0.minPoolSize">5</prop>
            <prop key="hibernate.c3p0.maxPoolSize">10</prop>
            <prop key="hibernate.c3p0.timeout">120</prop>
            <prop key="hibernate.c3p0.max_statement">100</prop>
            <prop key="hibernate.c3p0.idle_test_period">120</prop>
            <prop key="hibernate.c3p0.testConnectionOnCheckout">false</prop>
            <prop key="hibernate.generate_statistics">true</prop>
            <prop key="hibernate.jdbc.fetch_size">50</prop>
            <prop key="hibernate.jdbc.batch_size">30</prop>
            <prop key="hibernate.jdbc.use_streams_for_binary">true</prop>
            <prop key="hibernate.jdbc.use_get_generated_keys">true</prop>
            <prop key="hibernate.cache.use_query_cache">true</prop>
            <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
            <prop key="hibernate.max_fetch_depth">3</prop>
            <prop key="hibernate.show_sql">true</prop>
          </props>
        </property>
      </bean>
      <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource">
          <ref local="dataSource"/>
        </property>
        <property name="hibernateProperties">
          <ref bean="hibernateProperties"/>
        </property>
         ......
      

  4.   

    数据处理层代码如下:
    public Collection findCsHqSaleCardDtl(int pageNum, int pageCount, CsHqSaleCardHdr csHqSaleCardHdr, String fieldName, String orderType) throws DAOException {
    List list = null;
    String hql = "";
    int firstResult = 0;
    Session session = null;
    try {
    hql = "from CsHqSaleCardHdr  t  where 1=1 ";

                //如果saleID(分配交易号)不为空的情况作为查询条件
    if(!"".equals(StringUtil.doString(csHqSaleCardHdr.getSaleID()))){
    hql = hql + " and t.saleID like '%"  + StringUtil.doString(csHqSaleCardHdr.getSaleID())+ "%'";
    }
                //如果tradeID(分配交易号)不为空的情况作为查询条件
    if(!"".equals(StringUtil.doString(csHqSaleCardHdr.getTradeID()))){
    hql = hql + " and t.tradeID like '%"  + StringUtil.doString(csHqSaleCardHdr.getTradeID())+ "%'";
    }
                //如果日期不为空的情况作为查询条件
    if(!"".equals(StringUtil.doString(csHqSaleCardHdr.getSaleDateStr()))){
    hql = hql + " and t.saleDate =To_Date('"+csHqSaleCardHdr.getSaleDateStr()+"', 'YYYY-MM-DD')";
    }
                //如果name不为空的情况作为查询条件
    if(!"".equals(StringUtil.doString(csHqSaleCardHdr.getAgentName()))){
    hql = hql + " and t.agentName like '%" + StringUtil.doString(csHqSaleCardHdr.getAgentName()) + "%'";
    }
                //如果tradeDetail不为空的情况作为查询条件
    if(!"".equals(StringUtil.doString(csHqSaleCardHdr.getTradeDetail()))){
    hql = hql + " and t.tradeDetail like '%" + StringUtil.doString(csHqSaleCardHdr.getTradeDetail())+ "%'";
    }
                //如果totalAmt不为空的情况作为查询条件
    if(!"".equals(StringUtil.doString(csHqSaleCardHdr.getTotalAmt()))){
    hql = hql + " and t.totalAmt like '%"  + StringUtil.doString(csHqSaleCardHdr.getTotalAmt())+ "%'" ;
    }
    //如果discountratio不为空的情况作为查询条件
    if(!"".equals(StringUtil.doString(csHqSaleCardHdr.getDiscountratio()))){
    hql = hql + " and t.discountratio like '%"  + StringUtil.doString(csHqSaleCardHdr.getDiscountratio()) + "%'";
    }

                //如果shouldReceiveAmt(实际总金额)不为空的情况作为查询条件
    if(!"".equals(StringUtil.doString(csHqSaleCardHdr.getShouldReceiveAmt()))){
    hql = hql + " and t.shouldReceiveAmt like '%"  + StringUtil.doString(csHqSaleCardHdr.getShouldReceiveAmt()) + "%'";
    }
    hql = hql + " order by " + fieldName + " " + orderType +" ";
    // 处理firstResult的值   
    if (pageNum <= 0) {
    firstResult = 1;
    } else {
    firstResult = (pageNum - 1) * pageCount;
    }

    session = getSession();

    Query query = session.createQuery(hql);

    //设置游标起始位置
    query.setFirstResult(firstResult);
    //设置游标记录数
    query.setMaxResults(pageCount);

    list = query.list();
    if ((list != null) && (list.size() > 0)) {
    return list;
    } else {
    return new ArrayList();
    }
    } catch (DataAccessException ex) {
    logger.error("查询点卡信息出现异常:" + ex.getMessage());
    ex.printStackTrace();
    throw new DAOException("查询点卡信息出现异常:" + ex.getMessage());
    }
    catch(Exception ex){
    ex.printStackTrace();
    logger.error("查询点卡信息出现异常:" + ex.getMessage());
    throw new DAOException("查询点卡信息出现异常:" + ex.getMessage());
    }
    finally{
    //释放session对象

    releaseSession(session);
    }
    }
      

  5.   

    XD,能否把你
    Query query = session.createQuery(hql);
    这句里面的hql用System.out.print出来值贴出来?
    然后把hql的值放到Oracle数据库里面单独执行一下,看有没有什么错误?