quarkiverse / quarkus-mybatis

Quarkus MyBatis Extension
Apache License 2.0
89 stars 33 forks source link

please support org.mybatis.dynamic-sql:mybatis-dynamic-sql:1.5.0 #335

Closed ezlearning closed 1 year ago

ezlearning commented 1 year ago

please support org.mybatis.dynamic-sql:mybatis-dynamic-sql:1.5.0.

currently, in native build, i got this exception:

### Error querying database.  Cause: org.apache.ibatis.builder.BuilderException: Error invoking SqlProvider method 'public java.lang.String org.mybatis.dynamic.sql.util.SqlProviderAdapter.select(org.mybatis.dynamic.sql.select.render.SelectStatementProvider)' with specify parameter 'class org.mybatis.dynamic.sql.select.render.DefaultSelectStatementProvider'.  Cause: java.lang.NoSuchMethodException: org.mybatis.dynamic.sql.util.SqlProviderAdapter.<init>()
### Cause: org.apache.ibatis.builder.BuilderException: Error invoking SqlProvider method 'public java.lang.String org.mybatis.dynamic.sql.util.SqlProviderAdapter.select(org.mybatis.dynamic.sql.select.render.SelectStatementProvider)' with specify parameter 'class org.mybatis.dynamic.sql.select.render.DefaultSelectStatementProvider'.  Cause: java.lang.NoSuchMethodException: org.mybatis.dynamic.sql.util.SqlProviderAdapter.<init>()
    at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:153)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:145)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:76)
    at java.base@19.0.2/java.lang.reflect.Method.invoke(Method.java:578)
    at io.quarkiverse.mybatis.runtime.TransactionalSqlSession$TransactionalSqlSessionInterceptor.invoke(TransactionalSqlSession.java:197)
    at jdk.proxy4/jdk.proxy4.$Proxy112.selectOne(Unknown Source)
    at io.quarkiverse.mybatis.runtime.TransactionalSqlSession.selectOne(TransactionalSqlSession.java:46)
    at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:87)
    at org.apache.ibatis.binding.MapperProxy$PlainMethodInvoker.invoke(MapperProxy.java:145)
    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:86)
    at jdk.proxy4/jdk.proxy4.$Proxy46.selectOne(Unknown Source)
    at dev.icode.quarkus.quickstart.g02_mybatis.MyBatisResource.storeDetailV2(MyBatisResource.kt:38)
    at dev.icode.quarkus.quickstart.g02_mybatis.MyBatisResource$quarkusrestinvoker$storeDetailV2_1f89b2f65e602a8ed3a7ef02c1c5cd82c348bd7a.invoke(Unknown Source)
    at org.jboss.resteasy.reactive.server.handlers.InvocationHandler.handle(InvocationHandler.java:29)
    at io.quarkus.resteasy.reactive.server.runtime.QuarkusResteasyReactiveRequestContext.invokeHandler(QuarkusResteasyReactiveRequestContext.java:141)
    at org.jboss.resteasy.reactive.common.core.AbstractResteasyReactiveContext.run(AbstractResteasyReactiveContext.java:145)
    at io.quarkus.vertx.core.runtime.VertxCoreRecorder$14.runWith(VertxCoreRecorder.java:576)
    at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513)
    at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1538)
    at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:29)
    at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:29)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.base@19.0.2/java.lang.Thread.run(Thread.java:1589)
    at org.graalvm.nativeimage.builder/com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:775)
    at org.graalvm.nativeimage.builder/com.oracle.svm.core.posix.thread.PosixPlatformThreads.pthreadStartRoutine(PosixPlatformThreads.java:203)
Caused by: org.apache.ibatis.builder.BuilderException: Error invoking SqlProvider method 'public java.lang.String org.mybatis.dynamic.sql.util.SqlProviderAdapter.select(org.mybatis.dynamic.sql.select.render.SelectStatementProvider)' with specify parameter 'class org.mybatis.dynamic.sql.select.render.DefaultSelectStatementProvider'.  Cause: java.lang.NoSuchMethodException: org.mybatis.dynamic.sql.util.SqlProviderAdapter.<init>()
    at org.apache.ibatis.builder.annotation.ProviderSqlSource.createSqlSource(ProviderSqlSource.java:194)
    at org.apache.ibatis.builder.annotation.ProviderSqlSource.getBoundSql(ProviderSqlSource.java:156)
    at org.apache.ibatis.mapping.MappedStatement.getBoundSql(MappedStatement.java:305)
    at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:87)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:151)
    ... 25 more
Caused by: java.lang.NoSuchMethodException: org.mybatis.dynamic.sql.util.SqlProviderAdapter.<init>()
    at java.base@19.0.2/java.lang.Class.getConstructor0(DynamicHub.java:3641)
    at java.base@19.0.2/java.lang.Class.getDeclaredConstructor(DynamicHub.java:2810)
    at org.apache.ibatis.builder.annotation.ProviderSqlSource.invokeProviderMethod(ProviderSqlSource.java:232)
    at org.apache.ibatis.builder.annotation.ProviderSqlSource.createSqlSource(ProviderSqlSource.java:177)
    ... 29 more

Mapper

import org.apache.ibatis.annotations.Mapper
import org.apache.ibatis.annotations.Param
import org.apache.ibatis.annotations.Select

import org.mybatis.dynamic.sql.util.mybatis3.CommonCountMapper
import org.mybatis.dynamic.sql.util.mybatis3.CommonDeleteMapper
import org.mybatis.dynamic.sql.util.mybatis3.CommonInsertMapper
import org.mybatis.dynamic.sql.util.mybatis3.CommonUpdateMapper
import org.apache.ibatis.annotations.SelectProvider
import org.mybatis.dynamic.sql.util.SqlProviderAdapter
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider

class CtStore {
    var storeSn: String = ""
    var storeNo: String = ""
}

@Mapper
interface CtStoreMapper : CommonCountMapper, CommonDeleteMapper, CommonInsertMapper<CtStore>, CommonUpdateMapper {
    @SelectProvider(type = SqlProviderAdapter::class, method = "select")
    fun selectMany(selectStatement: SelectStatementProvider): List<CtStore>

    @SelectProvider(type = SqlProviderAdapter::class, method = "select")
    fun selectOne(selectStatement: SelectStatementProvider): CtStore?
}
zhfeng commented 1 year ago

So does it work in JVM mode? And I think you can try to add @RegisterForReflection(target = "org.mybatis.dynamic.sql.util.SqlProviderAdapter") to if it can resolve the native building error.

ezlearning commented 1 year ago

thank you very much, it worked.

import io.quarkus.runtime.annotations.RegisterForReflection
import org.apache.ibatis.annotations.Mapper
import org.apache.ibatis.annotations.Param
import org.apache.ibatis.annotations.Select

import org.mybatis.dynamic.sql.util.mybatis3.CommonCountMapper
import org.mybatis.dynamic.sql.util.mybatis3.CommonDeleteMapper
import org.mybatis.dynamic.sql.util.mybatis3.CommonInsertMapper
import org.mybatis.dynamic.sql.util.mybatis3.CommonUpdateMapper
import org.apache.ibatis.annotations.SelectProvider
import org.apache.ibatis.annotations.Result
import org.apache.ibatis.annotations.ResultMap
import org.apache.ibatis.annotations.Results
import org.apache.ibatis.type.JdbcType
import org.mybatis.dynamic.sql.select.render.DefaultSelectStatementProvider
import org.mybatis.dynamic.sql.util.SqlProviderAdapter
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider

@Mapper
@RegisterForReflection( targets = [SqlProviderAdapter::class, DefaultSelectStatementProvider::class])
interface CtStoreMapper : CommonCountMapper, CommonDeleteMapper, CommonInsertMapper<CtStore>, CommonUpdateMapper {
    @SelectProvider(type = SqlProviderAdapter::class, method = "select")
    @Results(id="CtStoreResult", value = [
        Result(column="store_no", property="storeNo", jdbcType=JdbcType.VARCHAR),
        Result(column="store_sn", property="storeSn", jdbcType=JdbcType.VARCHAR),
    ])
    fun selectMany(selectStatement: SelectStatementProvider): List<CtStore>

    @SelectProvider(type = SqlProviderAdapter::class, method = "select")
    @ResultMap("CtStoreResult")
    fun selectOne(selectStatement: SelectStatementProvider): CtStore?

    @Select("SELECT store_sn, store_no FROM ct_store WHERE store_sn = #{storeSn}")
    fun getStore(@Param("storeSn") storeSn: String): CtStore?

    @Select("SELECT store_sn, store_no FROM ct_store")
    fun getStoreList(): List<CtStore>
}