spring-boot - 为什么会出现错误,当我在 kotlin 中使用 querydsl 时?
问题描述
我想在springboot(kotlin)中使用querydsl,但是当我使用findOne()测试querydsl时,出现错误..
- 账户数据类
@Entity
data class Account(
val username: String,
val firstName: String,
val lastName: String
) {
@Id
@GeneratedValue
val id: Long? = null
}
- 帐户存储库
interface AccountRepository : JpaRepository<Account, Long>,
QuerydslPredicateExecutor<Account>
- 测试代码
@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()
}
}
- 错误信息
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...
有人要检查吗?
解决方案
我解决了这个问题。原因是插件版本问题..当我将版本更改为最新版本时,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
推荐阅读
- r - 当我在 Shiny 的表格中选择一行时,如何更改传单中的圆形标记颜色?
- visual-studio-code - 如何在 VS Code 中设置连续缩进?
- java - 如何测试 SpringBoot 优雅关机?
- javascript - Gatsby 使用 axios 将文件从表单数据发送到 getform.io
- ruby-on-rails - CSS 使用 Rails 自动链接到 HTML
- swift - 带 DispatchGroup 的异步函数
- html - 无法让“对齐项目”在 flexbox 中工作
- gatsby - 在 Gatsby 中实现静态 og 图像
- angular - Observable 返回对象数组,但不能访问对象属性
- javascript - 如果输入太快,js 会丢失字符