Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[错误报告]: kotlin 使用 KtQueryWrapper 的 select 方法会报空指针异常 #6673

Open
gaohongf opened this issue Jan 17, 2025 · 1 comment

Comments

@gaohongf
Copy link

gaohongf commented Jan 17, 2025

当前程序版本

mybatis-plus-spring-boot3-starter:3.5.8

问题描述

kotlin 使用 KtQueryWrapper 的 select 方法会报空指针异常

原因:
这个select调用了默认方法com.baomidou.mybatisplus.core.conditions.query.Query#select(Predicate predicate)

    default Children select(Predicate<TableFieldInfo> predicate) {
        return this.select(null, predicate);
    }

这个默认方法调用对应实现类的

Children select(Class<T> entityClass, Predicate<TableFieldInfo> predicate);

其中 com.baomidou.mybatisplus.extension.kotlin.KtQueryWrapper 这个类中关于这个 [select] 的实现被声明为

override fun select(entityClass: Class<T>, predicate: Predicate<TableFieldInfo>): KtQueryWrapper<T>

可以发现其中名为 entityClass 的参数是不可以为null的, kotlin 对此会进行非空校验, 然而调用上面的默认方法将 null 直接传入就导致了 kotlin 报出空指针异常, 我觉得解决办法应该就是屏蔽掉非空校验就行了(如下: 加个 ?)
也可能这个问号会影响别的,不知道,希望能解决.

override fun select(entityClass: Class<T>?, predicate: Predicate<TableFieldInfo>): KtQueryWrapper<T>

测试代码:

package com.example.demo

import com.baomidou.mybatisplus.extension.kotlin.KtQueryWrapper
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest

@SpringBootTest
class Demo2ApplicationTests {
    @set:Autowired
    lateinit var studentMapper: StudentMapper
    @Test
    fun contextLoads() {
        val includeFields = listOf(Student::id.name, Student::name.name)
        studentMapper.selectList(KtQueryWrapper(Student()).select {
            it.field.name in includeFields
        })
    }

}

详细堆栈日志

java.lang.NullPointerException: Parameter specified as non-null is null: method com.baomidou.mybatisplus.extension.kotlin.KtQueryWrapper.select, parameter entityClass

	at com.baomidou.mybatisplus.extension.kotlin.KtQueryWrapper.select(KtQueryWrapper.kt)
	at com.baomidou.mybatisplus.extension.kotlin.KtQueryWrapper.select(KtQueryWrapper.kt:35)
	at com.baomidou.mybatisplus.core.conditions.query.Query.select(Query.java:78)
	at com.example.demo.Demo2ApplicationTests.contextLoads(Demo2ApplicationTests.kt:15)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
@gaohongf
Copy link
Author

gaohongf commented Jan 17, 2025

测试代码改成这样也是一样的,我只要是KtQueryWrapper调用这个方法一定会报错

        studentMapper.selectList(KtQueryWrapper(Student()).select { true })

不去查询光是调用也会报错

@SpringBootTest
class Demo2ApplicationTests {

    @Test
    fun contextLoads() {
        KtQueryWrapper(Student()).select { true }
    }

}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant