一:概述

对数据库进行操作时,不仅仅是一个表的查询,简单的两个表之间的查询也是日常开发中需要使用的,在这篇文章中我将说明在做一个简单的练习时,出现的错误。针对两个错误我将给出详细的错误并且给出解释和给出解决的办法,解决办法均来自收集整理。

二:具体说明

<1>问题具体报错

第一个问题:
org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [isPayment, providerId, param3, productName, param1, param2]
### Cause: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [isPayment, providerId, param3, productName, param1, param2]

	at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:156)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142)
	at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:147)
	at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:80)
	at org.apache.ibatis.binding.MapperProxy$PlainMethodInvoker.invoke(MapperProxy.java:141)
	at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:86)
	at com.sun.proxy.$Proxy7.findBillByProviderIdAndIsPaymentAndProductName(Unknown Source)
	at club.zhuyue.test.BillMapperTest.findBillByProviderIdAndIsPaymentAndProductNameTest(BillMapperTest.java:51)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
	at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
	at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232)
	at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)
Caused by: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [isPayment, providerId, param3, productName, param1, param2]
	at org.apache.ibatis.binding.MapperMethod$ParamMap.get(MapperMethod.java:210)
	at org.apache.ibatis.reflection.wrapper.MapWrapper.get(MapWrapper.java:46)
	at org.apache.ibatis.reflection.MetaObject.getValue(MetaObject.java:115)
	at org.apache.ibatis.executor.BaseExecutor.createCacheKey(BaseExecutor.java:225)
	at org.apache.ibatis.executor.CachingExecutor.createCacheKey(CachingExecutor.java:149)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:89)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154)
	... 32 more
第二个问题:
org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: org.apache.ibatis.binding.BindingException: Parameter 'productName' not found. Available parameters are [arg2, arg1, arg0, param3, param1, param2]
### Cause: org.apache.ibatis.binding.BindingException: Parameter 'productName' not found. Available parameters are [arg2, arg1, arg0, param3, param1, param2]

	at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:156)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142)
	at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:147)
	at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:80)
	at org.apache.ibatis.binding.MapperProxy$PlainMethodInvoker.invoke(MapperProxy.java:141)
	at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:86)
	at com.sun.proxy.$Proxy7.findBillByProviderIdAndIsPaymentAndProductName(Unknown Source)
	at club.zhuyue.test.BillMapperTest.findBillByProviderIdAndIsPaymentAndProductNameTest(BillMapperTest.java:51)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
	at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
	at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232)
	at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)
Caused by: org.apache.ibatis.binding.BindingException: Parameter 'productName' not found. Available parameters are [arg2, arg1, arg0, param3, param1, param2]
	at org.apache.ibatis.binding.MapperMethod$ParamMap.get(MapperMethod.java:210)
	at org.apache.ibatis.reflection.wrapper.MapWrapper.get(MapWrapper.java:46)
	at org.apache.ibatis.reflection.MetaObject.getValue(MetaObject.java:115)
	at org.apache.ibatis.executor.BaseExecutor.createCacheKey(BaseExecutor.java:225)
	at org.apache.ibatis.executor.CachingExecutor.createCacheKey(CachingExecutor.java:149)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:89)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154)
	... 32 more
第三个问题,这个问题和第二个报的都是同样的异常:
org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: org.apache.ibatis.reflection.ReflectionException: Could not set property 'providerName' of 'class club.zhuyue.pojo.Bill' with value 'Provider{id=3, proCode='null', proName='深圳市泰香米业有限公司', proDesc='null', proContact='null', proPhone='null', proAddress='null', proFax='null', createdBy=null, creationDate=Sun Oct 09 15:20:00 CST 2016, modifyBy=null, modifyDate=null, companyLicPicPath='null', orgCodePicPath='null'}' Cause: java.lang.IllegalArgumentException: argument type mismatch
### The error may exist in club/zhuyue/dao/BillMapper.xml
### The error may involve club.zhuyue.dao.BillMapper.findBillByProviderIdAndIsPaymentAndProductName
### The error occurred while handling results
### SQL: SELECT         smbms_bill.id AS bill_id,         smbms_bill.billCode,         smbms_bill.productName,         smbms_bill.totalPrice,         smbms_bill.isPayment,         smbms_bill.creationDate,          smbms_provider.id AS provider_id,         smbms_provider.proName         FROM smbms_bill  INNER JOIN smbms_provider ON smbms_bill.providerId = smbms_provider.id         WHERE  smbms_bill.productName LIKE ?         AND smbms_provider.id = ?         AND smbms_bill.isPayment = ?;
### Cause: org.apache.ibatis.reflection.ReflectionException: Could not set property 'providerName' of 'class club.zhuyue.pojo.Bill' with value 'Provider{id=3, proCode='null', proName='深圳市泰香米业有限公司', proDesc='null', proContact='null', proPhone='null', proAddress='null', proFax='null', createdBy=null, creationDate=Sun Oct 09 15:20:00 CST 2016, modifyBy=null, modifyDate=null, companyLicPicPath='null', orgCodePicPath='null'}' Cause: java.lang.IllegalArgumentException: argument type mismatch

	at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:156)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142)
	at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:147)
	at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:80)
	at org.apache.ibatis.binding.MapperProxy$PlainMethodInvoker.invoke(MapperProxy.java:141)
	at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:86)
	at com.sun.proxy.$Proxy7.findBillByProviderIdAndIsPaymentAndProductName(Unknown Source)
	at club.zhuyue.test.BillMapperTest.findBillByProviderIdAndIsPaymentAndProductNameTest(BillMapperTest.java:51)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
	at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
	at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232)
	at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)
Caused by: org.apache.ibatis.reflection.ReflectionException: Could not set property 'providerName' of 'class club.zhuyue.pojo.Bill' with value 'Provider{id=3, proCode='null', proName='深圳市泰香米业有限公司', proDesc='null', proContact='null', proPhone='null', proAddress='null', proFax='null', createdBy=null, creationDate=Sun Oct 09 15:20:00 CST 2016, modifyBy=null, modifyDate=null, companyLicPicPath='null', orgCodePicPath='null'}' Cause: java.lang.IllegalArgumentException: argument type mismatch
	at org.apache.ibatis.reflection.wrapper.BeanWrapper.setBeanProperty(BeanWrapper.java:181)
	at org.apache.ibatis.reflection.wrapper.BeanWrapper.set(BeanWrapper.java:61)
	at org.apache.ibatis.reflection.MetaObject.setValue(MetaObject.java:119)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.linkObjects(DefaultResultSetHandler.java:1231)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.applyNestedResultMappings(DefaultResultSetHandler.java:1073)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getRowValue(DefaultResultSetHandler.java:449)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValuesForNestedResultMap(DefaultResultSetHandler.java:1027)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValues(DefaultResultSetHandler.java:335)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSet(DefaultResultSetHandler.java:310)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(DefaultResultSetHandler.java:202)
	at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:66)
	at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80)
	at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65)
	at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336)
	at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:90)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154)
	... 32 more
Caused by: java.lang.IllegalArgumentException: argument type mismatch
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.ibatis.reflection.invoker.MethodInvoker.invoke(MethodInvoker.java:44)
	at org.apache.ibatis.reflection.wrapper.BeanWrapper.setBeanProperty(BeanWrapper.java:175)
	... 49 more

<2>问题的详细说明以及解决办法

 2.1第1个问题

这段错误信息表明在使用 MyBatis 框架进行数据库操作时遇到了问题。具体的错误是 org.apache.ibatis.binding.BindingException,它指出 MyBatis 无法找到名为 id 的参数。这通常发生在你的 Mapper 接口方法和 XML 映射文件中定义的参数不一致时。 错误分析 错误信息中提到了以下几个参数: - isPayment - providerId - param3 - productName - param1 - param2 但是,你在 Mapper 方法中可能试图使用了一个名为 id 的参数,这个参数在 XML 映射文件或 MyBatis 配置中没有被定义。

解决步骤:

1. 检查 Mapper 接口方法:确保你的方法参数名与 XML 映射文件中使用的参数名一致。例如,如果你的 Mapper 方法是这样定义的:

List<Bill> findBillById(int id);

确保在 XML 映射文件中,SQL 语句也使用 id 作为参数。

2. 检查 XML 映射文件:在你的 MyBatis 映射文件中,确保 SQL 查询语句正确地引用了参数。例如:

<select id="findBillById" resultType="Bill">
       SELECT * FROM bills WHERE id = #{id}
   </select>

3. 参数名称一致性:如果你的方法使用了多个参数,确保在 XML 映射文件中使用 @Param 注解来明确每个参数的名称,这样可以避免 MyBatis 参数解析的混淆。例如:

@Select("SELECT * FROM bills WHERE providerId = #{providerId} AND isPayment = #{isPayment}")
   List<Bill> findBillByProviderIdAndIsPayment(@Param("providerId") int providerId, @Param("isPayment") boolean isPayment);

4. 测试和验证:在做了上述更改后,重新运行你的测试或应用程序,以确保问题已经解决。

5. 日志和调试:如果问题仍然存在,增加日志输出或使用调试工具来查看方法调用时传递的参数,这有助于进一步诊断问题。

2.2 第2个问题

错误信息再次指出了一个参数绑定的问题,这次是 productName 参数。错误信息显示,尽管你尝试在查询中使用 productName 参数,但 MyBatis 却无法找到它,而是只找到了 arg0, arg1, arg2, param1, param2, param3 这些参数。错误分析 这个问题通常发生在 MyBatis 无法正确解析方法参数和 XML 映射文件中的参数名称时。如果方法参数较多,并且没有使用 @Param 注解来明确指定每个参数的名称,MyBatis 会使用 arg0, arg1 等来代替实际参数名称

解决步骤:

 1. 使用 @Param 注解:确保在你的 Mapper 接口方法中使用 @Param 注解来明确指定每个参数的名称。这可以帮助 MyBatis 正确识别和绑定参数。例如:

@Select("SELECT * FROM bills WHERE providerId = #{providerId} AND isPayment = #{isPayment} AND productName = #{productName}")
   List<Bill> findBillByProviderIdAndIsPaymentAndProductName(@Param("providerId") int providerId, @Param("isPayment") boolean isPayment, @Param("productName") String productName);

2. 检查 XML 映射文件:确保在 XML 映射文件中的 SQL 语句正确地使用了参数。例如:

<select id="findBillByProviderIdAndIsPaymentAndProductName" resultType="Bill">
       SELECT * FROM bills WHERE providerId = #{providerId} AND isPayment = #{isPayment} AND productName = #{productName}
   </select>

3. 参数名称一致性:确保 Mapper 接口方法中的参数名称与 XML 映射文件中使用的参数名称完全一致。

4. 测试和验证:在做了上述更改后,重新运行你的测试或应用程序,以确保问题已经解决。

5. 日志和调试:如果问题仍然存在,增加日志输出或使用调试工具来查看方法调用时传递的参数,这有助于进一步诊断问题。

2.3 第3个问题

这个错误信息指出在 MyBatis 处理数据库查询结果时发生了反射异常。具体来说,MyBatis 试图将查询结果中的某个字段值赋给 club.zhuyue.pojo.Bill 类的 providerName 属性,但是遇到了类型不匹配的问题。错误分析 -

问题核心Could not set property 'providerName' of 'class club.zhuyue.pojo.Bill' with value 'Provider{id=3, proCode='null', proName='深圳市泰香米业有限公司', proDesc='null', proContact='null', proPhone='null', proAddress='null', proFax='null', createdBy=null, creationDate=Sun Oct 09 15:20:00 CST 2016, modifyBy=null, modifyDate=null, companyLicPicPath='null', orgCodePicPath='null'}' 这表明 MyBatis 期望 providerName 是一个简单的数据类型(如 String),但实际上却是一个 Provider 对象。

解决步骤:

1. 检查 Bill:首先确认 Bill 类中的 providerName 属性的类型。如果该属性应该是一个 Provider 类型的对象,而不是简单的字符串或其他类型,你需要确保这一点。

 2. 修改 Bill:如果 providerName 应该是 Provider 类型,确保 Bill 类中有这样的定义和对应的 getter 和 setter 方法。例如:

public class Bill {
       private Provider provider;  // 注意属性名可能需要从 providerName 改为 provider

       public Provider getProvider() {
           return provider;
       }

       public void setProvider(Provider provider) {
           this.provider = provider;
       }
   }

3. 检查 MyBatis 映射文件:在 BillMapper.xml 中,确保你正确地配置了结果映射。如果你希望将 smbms_provider 表的查询结果映射到 Bill 类的 provider 属性,你的 &lt;resultMap&gt; 应该类似于:

<resultMap id="BillResultMap" type="club.zhuyue.pojo.Bill">
       <id column="bill_id" property="id" />
       <result column="billCode" property="billCode" />
       <result column="productName" property="productName" />
       <result column="totalPrice" property="totalPrice" />
       <result column="isPayment" property="isPayment" />
       <result column="creationDate" property="creationDate" />
       <association property="provider" javaType="club.zhuyue.pojo.Provider">
           <result column="provider_id" property="id"/>
           <result column="proName" property="proName"/>
           <!-- 其他 Provider 类的属性映射 -->
       </association>
   </resultMap>

4. 重新运行测试:在做了上述更改后,重新运行你的测试或应用程序,以确保问题已经解决。

5. 日志和调试:如果问题仍然存在,增加日志输出或使用调试工具来查看 MyBatis 是如何处理结果映射的,这有助于进一步诊断问题。