原创

org.hibernate.Exception.SQLGrammarException: Hibernate 5 へのアップグレード後に ResultSet を抽出できませんでした SQLGrammarException: クエリを実行できませんでした

温馨提示:
本文最后更新于 2024年04月12日,已超过 48 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

I am upgrading my project's tech stack and in the middle of upgrading to hibernate 5.6.15.FINAL

I have made the majority of upgrades and my application is presenting when i go to localhost but it crashes pretty quick after startup with the following error.

I am pretty sure it is something to do with the proxy but unsure what? maybe i am totally off, but struggling to see what is wrong

i have put everything down below which i think you would need - but if you want to know anything else, just let me know

org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet
    at org.springframework.orm.hibernate5.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:195) ~[spring-orm-5.3.30.jar:5.3.30]
    at org.springframework.orm.hibernate5.HibernateExceptionTranslator.convertHibernateAccessException(HibernateExceptionTranslator.java:102) ~[spring-orm-5.3.30.jar:5.3.30]
    at org.springframework.orm.hibernate5.HibernateExceptionTranslator.translateExceptionIfPossible(HibernateExceptionTranslator.java:73) ~[spring-orm-5.3.30.jar:5.3.30]
    at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61) ~[spring-tx-5.3.30.jar:5.3.30]
    at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:243) ~[spring-tx-5.3.30.jar:5.3.30]
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:152) ~[spring-tx-5.3.30.jar:5.3.30]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.30.jar:5.3.30]
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:241) ~[spring-aop-5.3.30.jar:5.3.30]
    at com.sun.proxy.$Proxy90.findCurrentAlarmByType(Unknown Source) ~[?:?]
    at com.application.alarm.domain.AlarmRootImpl.checkForCurrentAlarmByType(AlarmRootImpl.java:79) ~[classes/:?]
    at com.service.alarm.AlarmServiceImpl.getCurrentAlarmsByType_aroundBody22(AlarmServiceImpl.java:183) ~[classes/:?]
    at com.service.alarm.AlarmServiceImpl$AjcClosure23.run(AlarmServiceImpl.java:1) ~[classes/:?]
    at org.springframework.transaction.aspectj.AbstractTransactionAspect.ajc$around$org_springframework_transaction_aspectj_AbstractTransactionAspect$1$2a73e96cproceed(AbstractTransactionAspect.aj:67) ~[spring-aspects-5.3.30.jar:5.3.30]
    at org.springframework.transaction.aspectj.AbstractTransactionAspect$AbstractTransactionAspect$1.proceedWithInvocation(AbstractTransactionAspect.aj:73) ~[spring-aspects-5.3.30.jar:5.3.30]
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) ~[spring-tx-5.3.30.jar:5.3.30]
    at org.springframework.transaction.aspectj.AbstractTransactionAspect.ajc$around$org_springframework_transaction_aspectj_AbstractTransactionAspect$1$2a73e96c(AbstractTransactionAspect.aj:71) ~[spring-aspects-5.3.30.jar:5.3.30]
    at com.service.alarm.AlarmServiceImpl.getCurrentAlarmsByType(AlarmServiceImpl.java:182) ~[classes/:?]
    at com.application.dataload.HeartbeatMapForceMonitor.checkReceivedStatus(HeartbeatMapForceMonitor.java:54) ~[classes/:?]
    at com.application.dataload.gas.GasMonitor.run_aroundBody0(GasMonitor.java:188) ~[classes/:?]
    at com.application.dataload.gas.GasMonitor$AjcClosure1.run(GasMonitor.java:1) ~[classes/:?]
    at org.springframework.transaction.aspectj.AbstractTransactionAspect.ajc$around$org_springframework_transaction_aspectj_AbstractTransactionAspect$1$2a73e96cproceed(AbstractTransactionAspect.aj:67) ~[spring-aspects-5.3.30.jar:5.3.30]
    at org.springframework.transaction.aspectj.AbstractTransactionAspect$AbstractTransactionAspect$1.proceedWithInvocation(AbstractTransactionAspect.aj:73) ~[spring-aspects-5.3.30.jar:5.3.30]
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) ~[spring-tx-5.3.30.jar:5.3.30]
    at org.springframework.transaction.aspectj.AbstractTransactionAspect.ajc$around$org_springframework_transaction_aspectj_AbstractTransactionAspect$1$2a73e96c(AbstractTransactionAspect.aj:71) ~[spring-aspects-5.3.30.jar:5.3.30]
    at com.application.dataload.gas.GasMonitor.run(GasMonitor.java:61) ~[classes/:?]
    at com.application.scheduling.SchedulableGasMeteringMonitor.executeJob(SchedulableGasMeteringMonitor.java:18) ~[classes/:?]
    at com.application.scheduling.AbstractSchedulable.execute(AbstractSchedulable.java:36) ~[classes/:?]
    at com.application.scheduling.domain.quartz.SchedulableExecutingQuartzJob.execute(SchedulableExecutingQuartzJob.java:20) ~application-plus-1.1.0-SNAPSHOT.jar:?]
    at org.quartz.core.JobRunShell.run(JobRunShell.java:202) ~[quartz-2.3.2.jar:?]
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) ~[quartz-2.3.2.jar:?]
Caused by: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:63) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:37) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:67) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
    at org.hibernate.loader.Loader.getResultSet(Loader.java:2322) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2075) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2037) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
    at org.hibernate.loader.Loader.doQuery(Loader.java:956) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:357) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
    at org.hibernate.loader.Loader.doList(Loader.java:2868) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
    at org.hibernate.loader.Loader.doList(Loader.java:2850) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2682) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
    at org.hibernate.loader.Loader.list(Loader.java:2677) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
    at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:109) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1922) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
    at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:370) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
    at org.hibernate.internal.CriteriaImpl.uniqueResult(CriteriaImpl.java:392) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
    at com.application.alarm.dao.hibernate.AlarmHibernateDao.findCurrentAlarmByType(AlarmHibernateDao.java:56) ~[classes/:?]
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?]
    at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
    at java.lang.reflect.Method.invoke(Method.java:566) ~[?:?]
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) ~[spring-aop-5.3.30.jar:5.3.30]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) ~[spring-aop-5.3.30.jar:5.3.30]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.30.jar:5.3.30]
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) ~[spring-tx-5.3.30.jar:5.3.30]
    ... 24 more

This is the method that is tripping over

import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
...

    @Override
    public Alarm findCurrentAlarmByType(AlarmType alarmType) {
        Criteria criteria = createCriteria();
        criteria.add(Restrictions.eq("alarmCurrent", true));
        criteria.add(Restrictions.eq("alarmType", alarmType));
        return (Alarm) criteria.uniqueResult();
    }

here is the hibernate xml mapping file associated as well

<hibernate-mapping default-access="field">
   <typedef name="AlarmCategory" class="com.application.core.dao.hibernate.usertype.EnumUserType">
         <param name="enumClassName">com.application.alarm.domain.AlarmCategory</param>
    </typedef>
    <typedef name="AlarmType" class="com.application.core.dao.hibernate.usertype.EnumUserType">
         <param name="enumClassName">com.application.alarm.domain.AlarmType</param>
    </typedef>
    <typedef name="AlarmPriority" class="com.application.core.dao.hibernate.usertype.EnumUserType">
         <param name="enumClassName">com.application.alarm.domain.AlarmPriority</param>
    </typedef>
    <class name="com.application.alarm.domain.AlarmImpl" table="ALARM">
        <id name="id" type="java.lang.Long">
            <column name="ID" precision="22" scale="0" />
            <generator class="sequence">
                <param name="sequence">ALARM_ID_SEQ</param>
            </generator>
        </id>
         <property name="alarmCategory" type="AlarmCategory">
            <column name="ALARM_CATEGORY" precision="22" scale="0" not-null="true" />
        </property>
        <property name="alarmType" type="AlarmType">
            <column name="ALARM_TYPE" precision="22" scale="0" not-null="true" />
        </property>
        <property name="alarmStartTime" type="DateTime">
            <column name="ALARM_START_TIME" length="7" not-null="true" />
        </property>
        <property name="alarmEndTime" type="DateTime">
            <column name="ALARM_END_TIME" length="7" not-null="false" />
        </property>
        <property name="alarmPriority" type="AlarmPriority">
            <column name="ALARM_PRIORITY" precision="22" scale="0" not-null="true" />
        </property>
         <property name="alarmCurrent" type="yes_no">
            <column name="ALARM_CURRENT"/>
        </property>
         <property name="alarmAck" type="yes_no">
            <column name="ALARM_ACK"/>
        </property>
        <property name="localisedParamString" type="java.lang.String">
            <column name="LOCALISED_PARAM" length="200" />
        </property>        
        <many-to-one name="storageUser" class="com.application.contractMaintenance.domain.StorageUserImpl" fetch="select">
            <column name="STORAGE_USER_ID" precision="22" scale="0" not-null="false" />
        </many-to-one>
    </class>
</hibernate-mapping>

side note

i also get a further error just after but not sure if it is in relation to this - thought it would be good info to include

```Caused by: java.sql.SQLSyntaxErrorException: ORA-01722: invalid number

    at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:509) ~[ojdbc10-19.10.0.0.jar:19.10.0.0.0]
    at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:461) ~[ojdbc10-19.10.0.0.jar:19.10.0.0.0]
    at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1104) ~[ojdbc10-19.10.0.0.jar:19.10.0.0.0]
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:553) ~[ojdbc10-19.10.0.0.jar:19.10.0.0.0]
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:269) ~[ojdbc10-19.10.0.0.jar:19.10.0.0.0]
    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:655) ~[ojdbc10-19.10.0.0.jar:19.10.0.0.0]
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:270) ~[ojdbc10-19.10.0.0.jar:19.10.0.0.0]
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:91) ~[ojdbc10-19.10.0.0.jar:19.10.0.0.0]
    at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:807) ~[ojdbc10-19.10.0.0.jar:19.10.0.0.0]
    at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:983) ~[ojdbc10-19.10.0.0.jar:19.10.0.0.0]
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1168) ~[ojdbc10-19.10.0.0.jar:19.10.0.0.0]
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3666) ~[ojdbc10-19.10.0.0.jar:19.10.0.0.0]
    at oracle.jdbc.driver.T4CPreparedStatement.executeInternal(T4CPreparedStatement.java:1426) ~[ojdbc10-19.10.0.0.jar:19.10.0.0.0]
    at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3713) ~[ojdbc10-19.10.0.0.jar:19.10.0.0.0]
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1167) ~[ojdbc10-19.10.0.0.jar:19.10.0.0.0]
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96) ~[commons-dbcp-1.4.jar:1.4]
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96) ~[commons-dbcp-1.4.jar:1.4]
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:57) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
    at org.hibernate.loader.Loader.getResultSet(Loader.java:2322) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2075) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2037) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
    at org.hibernate.loader.Loader.doQuery(Loader.java:956) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:357) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
    at org.hibernate.loader.Loader.doList(Loader.java:2868) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
    at org.hibernate.loader.Loader.doList(Loader.java:2850) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2682) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
    at org.hibernate.loader.Loader.list(Loader.java:2677) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
    at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:109) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1922) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
    at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:370) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
    at org.hibernate.internal.CriteriaImpl.uniqueResult(CriteriaImpl.java:392) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
    at com.application.alarm.dao.hibernate.AlarmHibernateDao.findCurrentAlarmByType(AlarmHibernateDao.java:56) ~[classes/:?]
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?]
    at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
    at java.lang.reflect.Method.invoke(Method.java:566) ~[?:?]
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) ~[spring-aop-5.3.30.jar:5.3.30]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) ~[spring-aop-5.3.30.jar:5.3.30]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.30.jar:5.3.30]
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) ~[spring-tx-5.3.30.jar:5.3.30]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.30.jar:5.3.30]
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:241) ~[spring-aop-5.3.30.jar:5.3.30]
    at com.sun.proxy.$Proxy90.findCurrentAlarmByType(Unknown Source) ~[?:?]
    at com.application.alarm.domain.AlarmRootImpl.checkForCurrentAlarmByType(AlarmRootImpl.java:79) ~[classes/:?]
    at com.service.alarm.AlarmServiceImpl.getCurrentAlarmsByType_aroundBody22(AlarmServiceImpl.java:183) ~[classes/:?]
    at com.service.alarm.AlarmServiceImpl$AjcClosure23.run(AlarmServiceImpl.java:1) ~[classes/:?]
    at org.springframework.transaction.aspectj.AbstractTransactionAspect.ajc$around$org_springframework_transaction_aspectj_AbstractTransactionAspect$1$2a73e96cproceed(AbstractTransactionAspect.aj:67) ~[spring-aspects-5.3.30.jar:5.3.30]
    at org.springframework.transaction.aspectj.AbstractTransactionAspect$AbstractTransactionAspect$1.proceedWithInvocation(AbstractTransactionAspect.aj:73) ~[spring-aspects-5.3.30.jar:5.3.30]
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) ~[spring-tx-5.3.30.jar:5.3.30]
    at org.springframework.transaction.aspectj.AbstractTransactionAspect.ajc$around$org_springframework_transaction_aspectj_AbstractTransactionAspect$1$2a73e96c(AbstractTransactionAspect.aj:71) ~[spring-aspects-5.3.30.jar:5.3.30]
    at com.service.alarm.AlarmServiceImpl.getCurrentAlarmsByType(AlarmServiceImpl.java:182) ~[classes/:?]
    at com.application.dataload.HeartbeatMapForceMonitor.checkReceivedStatus(HeartbeatMapForceMonitor.java:54) ~[classes/:?]
    at com.application.dataload.gas.GasMonitor.run_aroundBody0(GasMonitor.java:188) ~[classes/:?]
    at com.application.dataload.gas.GasMonitor$AjcClosure1.run(GasMonitor.java:1) ~[classes/:?]
    at org.springframework.transaction.aspectj.AbstractTransactionAspect.ajc$around$org_springframework_transaction_aspectj_AbstractTransactionAspect$1$2a73e96cproceed(AbstractTransactionAspect.aj:67) ~[spring-aspects-5.3.30.jar:5.3.30]
    at org.springframework.transaction.aspectj.AbstractTransactionAspect$AbstractTransactionAspect$1.proceedWithInvocation(AbstractTransactionAspect.aj:73) ~[spring-aspects-5.3.30.jar:5.3.30]
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) ~[spring-tx-5.3.30.jar:5.3.30]
    at org.springframework.transaction.aspectj.AbstractTransactionAspect.ajc$around$org_springframework_transaction_aspectj_AbstractTransactionAspect$1$2a73e96c(AbstractTransactionAspect.aj:71) ~[spring-aspects-5.3.30.jar:5.3.30]
    at com.application.dataload.gas.GasMonitor.run(GasMonitor.java:61) ~[classes/:?]
    at com.application.scheduling.SchedulableGasMeteringMonitor.executeJob(SchedulableGasMeteringMonitor.java:18) ~[classes/:?]
    at com.application.scheduling.AbstractSchedulable.execute(AbstractSchedulable.java:36) ~[classes/:?]
    at com.application.scheduling.domain.quartz.SchedulableExecutingQuartzJob.execute(SchedulableExecutingQuartzJob.java:20) ~[hydrocarbon-plus-1.1.0-SNAPSHOT.jar:?]
    at org.quartz.core.JobRunShell.run(JobRunShell.java:202) ~[quartz-2.3.2.jar:?]
    ... 1 more
正文到此结束
热门推荐
本文目录