将 QuerydslPredicateExecutor 与 JpaRepository 一起使用时出现 IllegalAccessException
IllegalAccessException when using QuerydslPredicateExecutor with JpaRepository
申请:
- 科特林 1.6
- jdk 17(也试过 8 和 11)
- gradle 7.3
- spring-boot 2.6.0
- spring-data-jpa
- querydsl 5.0
- jpa
- 科特林
- 适合
- kotlin-codegen
我正在尝试将 QuerydslPredicateExecutor
与 JpaRepository
一起使用,但是当应用程序启动时,它无法使用 IllegalStateException
进行初始化,因为它无法访问某些字段或者生成Q-class.
的方法
使用 JPAQuery
而不是 QuerydslPredicateExecutor
存储库是可行的。
任何关于潜在问题的想法都将不胜感激。
实体
@Entity
class Workplace(
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long? = null,
var name: String,
var description: String,
var location: String,
)
存储库:
@Repository
interface WorkplaceRepository : JpaRepository<Workplace, Long>, QuerydslPredicateExecutor<Workplace>
服务:
@Service
class WorkplaceService(
private val workplaceRepository: WorkplaceRepository,
) {
fun findAll(searchOpts: SearchOpts): Iterable<Workplace> {
return workplaceRepository.findAll(searchOpts.toPredicate())
}
}
失败并出现异常:
Caused by: java.lang.IllegalStateException: Could not access method or field: class org.springframework.util.ReflectionUtils cannot access a member of class <package>.QWorkplace with modifiers "private static final"
at org.springframework.util.ReflectionUtils.handleReflectionException(ReflectionUtils.java:107) ~[spring-core-5.3.13.jar:5.3.13]
at org.springframework.util.ReflectionUtils.getField(ReflectionUtils.java:657) ~[spring-core-5.3.13.jar:5.3.13]
at org.springframework.data.querydsl.SimpleEntityPathResolver.lambda$createPath[=13=](SimpleEntityPathResolver.java:74) ~[spring-data-commons-2.6.0.jar:2.6.0]
at java.base/java.util.Optional.map(Optional.java:260) ~[na:na]
at org.springframework.data.querydsl.SimpleEntityPathResolver.createPath(SimpleEntityPathResolver.java:74) ~[spring-data-commons-2.6.0.jar:2.6.0]
at org.springframework.data.jpa.repository.support.QuerydslJpaPredicateExecutor.<init>(QuerydslJpaPredicateExecutor.java:81) ~[spring-data-jpa-2.6.0.jar:2.6.0]
at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getRepositoryFragments(JpaRepositoryFactory.java:272) ~[spring-data-jpa-2.6.0.jar:2.6.0]
at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getRepositoryFragments(JpaRepositoryFactory.java:242) ~[spring-data-jpa-2.6.0.jar:2.6.0]
at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepositoryComposition(RepositoryFactorySupport.java:434) ~[spring-data-commons-2.6.0.jar:2.6.0]
at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:300) ~[spring-data-commons-2.6.0.jar:2.6.0]
at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.lambda$afterPropertiesSet(RepositoryFactoryBeanSupport.java:322) ~[spring-data-commons-2.6.0.jar:2.6.0]
at org.springframework.data.util.Lazy.getNullable(Lazy.java:230) ~[spring-data-commons-2.6.0.jar:2.6.0]
at org.springframework.data.util.Lazy.get(Lazy.java:114) ~[spring-data-commons-2.6.0.jar:2.6.0]
at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:328) ~[spring-data-commons-2.6.0.jar:2.6.0]
at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:144) ~[spring-data-jpa-2.6.0.jar:2.6.0]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863) ~[spring-beans-5.3.13.jar:5.3.13]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800) ~[spring-beans-5.3.13.jar:5.3.13]
... 179 common frames omitted
然而这有效:
存储库:
@Repository
interface WorkplaceRepository : JpaRepository<Workplace, Long>
服务
@Service
class WorkplaceService(
private val workplaceRepository: WorkplaceRepository,
private val entityManager: EntityManager,
) {
fun findAll(searchOpts: SearchOpts): Iterable<Workplace> {
return JPAQuery<Workplace>(entityManager)
.from(QWorkplace.workplace)
.where(searchOpts.toPredicate())
.fetch()
}
}
我认为这与 https://github.com/querydsl/querydsl/pull/3076 中已修复但尚未发布的错误有关。
申请:
- 科特林 1.6
- jdk 17(也试过 8 和 11)
- gradle 7.3
- spring-boot 2.6.0
- spring-data-jpa
- querydsl 5.0
- jpa
- 科特林
- 适合
- kotlin-codegen
我正在尝试将 QuerydslPredicateExecutor
与 JpaRepository
一起使用,但是当应用程序启动时,它无法使用 IllegalStateException
进行初始化,因为它无法访问某些字段或者生成Q-class.
使用 JPAQuery
而不是 QuerydslPredicateExecutor
存储库是可行的。
任何关于潜在问题的想法都将不胜感激。
实体
@Entity
class Workplace(
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long? = null,
var name: String,
var description: String,
var location: String,
)
存储库:
@Repository
interface WorkplaceRepository : JpaRepository<Workplace, Long>, QuerydslPredicateExecutor<Workplace>
服务:
@Service
class WorkplaceService(
private val workplaceRepository: WorkplaceRepository,
) {
fun findAll(searchOpts: SearchOpts): Iterable<Workplace> {
return workplaceRepository.findAll(searchOpts.toPredicate())
}
}
失败并出现异常:
Caused by: java.lang.IllegalStateException: Could not access method or field: class org.springframework.util.ReflectionUtils cannot access a member of class <package>.QWorkplace with modifiers "private static final"
at org.springframework.util.ReflectionUtils.handleReflectionException(ReflectionUtils.java:107) ~[spring-core-5.3.13.jar:5.3.13]
at org.springframework.util.ReflectionUtils.getField(ReflectionUtils.java:657) ~[spring-core-5.3.13.jar:5.3.13]
at org.springframework.data.querydsl.SimpleEntityPathResolver.lambda$createPath[=13=](SimpleEntityPathResolver.java:74) ~[spring-data-commons-2.6.0.jar:2.6.0]
at java.base/java.util.Optional.map(Optional.java:260) ~[na:na]
at org.springframework.data.querydsl.SimpleEntityPathResolver.createPath(SimpleEntityPathResolver.java:74) ~[spring-data-commons-2.6.0.jar:2.6.0]
at org.springframework.data.jpa.repository.support.QuerydslJpaPredicateExecutor.<init>(QuerydslJpaPredicateExecutor.java:81) ~[spring-data-jpa-2.6.0.jar:2.6.0]
at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getRepositoryFragments(JpaRepositoryFactory.java:272) ~[spring-data-jpa-2.6.0.jar:2.6.0]
at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getRepositoryFragments(JpaRepositoryFactory.java:242) ~[spring-data-jpa-2.6.0.jar:2.6.0]
at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepositoryComposition(RepositoryFactorySupport.java:434) ~[spring-data-commons-2.6.0.jar:2.6.0]
at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:300) ~[spring-data-commons-2.6.0.jar:2.6.0]
at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.lambda$afterPropertiesSet(RepositoryFactoryBeanSupport.java:322) ~[spring-data-commons-2.6.0.jar:2.6.0]
at org.springframework.data.util.Lazy.getNullable(Lazy.java:230) ~[spring-data-commons-2.6.0.jar:2.6.0]
at org.springframework.data.util.Lazy.get(Lazy.java:114) ~[spring-data-commons-2.6.0.jar:2.6.0]
at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:328) ~[spring-data-commons-2.6.0.jar:2.6.0]
at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:144) ~[spring-data-jpa-2.6.0.jar:2.6.0]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863) ~[spring-beans-5.3.13.jar:5.3.13]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800) ~[spring-beans-5.3.13.jar:5.3.13]
... 179 common frames omitted
然而这有效:
存储库:
@Repository
interface WorkplaceRepository : JpaRepository<Workplace, Long>
服务
@Service
class WorkplaceService(
private val workplaceRepository: WorkplaceRepository,
private val entityManager: EntityManager,
) {
fun findAll(searchOpts: SearchOpts): Iterable<Workplace> {
return JPAQuery<Workplace>(entityManager)
.from(QWorkplace.workplace)
.where(searchOpts.toPredicate())
.fetch()
}
}
我认为这与 https://github.com/querydsl/querydsl/pull/3076 中已修复但尚未发布的错误有关。