首页 > 解决方案 > 为什么会出现错误,当我在 kotlin 中使用 querydsl 时?

问题描述

我想在springboot(kotlin)中使用querydsl,但是当我使用findOne()测试querydsl时,出现错误..

  1. 账户数据类
@Entity
data class Account(
        val username: String,
        val firstName: String,
        val lastName: String
) {
    @Id
    @GeneratedValue
    val id: Long? = null
}
  1. 帐户存储库
interface AccountRepository : JpaRepository<Account, Long>,
        QuerydslPredicateExecutor<Account>
  1. 测试代码
@DataJpaTest
class AccountRepositoryTest {
    @Autowired
    lateinit var accountRepository: AccountRepository

    @Test
    fun crud() {

        accountRepository.save(Account(username = "sooyougkim",
                firstName = "sooyoug",
                lastName = "kim"))

        val predicate: Predicate = QAccount
                .account
                .firstName
                .containsIgnoreCase("sooyoug")
                .and(QAccount.account.lastName.startsWith("kim"))

        val findOne = accountRepository.findOne(predicate).get()

    }
}
  1. 错误信息
java.lang.UnsupportedOperationException
    at java.util.Collections$UnmodifiableMap.put(Collections.java:1459)
    at com.querydsl.jpa.JPQLSerializer.visitConstant(JPQLSerializer.java:327)
    at com.querydsl.core.support.SerializerBase.visit(SerializerBase.java:221)
    at com.querydsl.core.support.SerializerBase.visit(SerializerBase.java:36)
    at com.querydsl.core.types.ConstantImpl.accept(ConstantImpl.java:140)
    .
    .
    .
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
    at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
    at java.lang.Thread.run(Thread.java:821)

AccountRepositoryTest > crud() FAILED
    java.lang.UnsupportedOperationException at AccountRepositoryTest.kt:31
2020-07-30 09:58:37.653  INFO 21450 --- [extShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2020-07-30 09:58:37.653  INFO 21450 --- [extShutdownHook] .SchemaDropperImpl$DelayedDropActionImpl : HHH000477: Starting delayed evictData of schema as part of SessionFactory shut-down'
Hibernate: 
    

我认为有一些映射错误 QAccount -> Account...

有人要检查吗?

标签: spring-bootkotlinquerydsl

解决方案


我解决了这个问题。原因是插件版本问题..当我将版本更改为最新版本时,querydsl 表现良好。

这是我对 build.gradle.kts 的依赖

    api("com.querydsl:querydsl-jpa:4.3.1")
    kapt("com.querydsl:querydsl-apt:4.3.1:jpa") 

并且,您可以在此处查看插件的版本。 https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/html/appendix-dependency-versions.html


推荐阅读