首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IllegalAccessException在使用QuerydslPredicateExecutor和JpaRepository时

IllegalAccessException在使用QuerydslPredicateExecutor和JpaRepository时
EN

Stack Overflow用户
提问于 2021-11-25 21:52:56
回答 1查看 176关注 0票数 1

应用程序:

7.3

  • spring-boot
  • kotlin 1.6
  • jdk 17 (也尝试了8和11)
  • gradle 2.6.0
    • spring-data-jpa

  • jpa
  • kotlin
  • apt
  • kotlin-codegen

  • querydsl 5.0

我试图将QuerydslPredicateExecutorJpaRepository一起使用,但是当应用程序启动时,它无法使用IllegalStateException初始化,因为它无法访问生成的Q类的某些字段或方法。

不过,使用JPAQuery而不是QuerydslPredicateExecutor存储库是可行的。

任何关于什么可能是根本问题的想法都将受到欢迎。

实体

代码语言:javascript
复制
@Entity
class Workplace(
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    var id: Long? = null,
    var name: String,
    var description: String,
    var location: String,
)

储存库:

代码语言:javascript
复制
@Repository
interface WorkplaceRepository : JpaRepository<Workplace, Long>, QuerydslPredicateExecutor<Workplace>

该处:

代码语言:javascript
复制
@Service
class WorkplaceService(
    private val workplaceRepository: WorkplaceRepository,
) {
    
    fun findAll(searchOpts: SearchOpts): Iterable<Workplace> {
        return workplaceRepository.findAll(searchOpts.toPredicate())
    }
}

失败,但有例外:

代码语言:javascript
复制
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$0(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$5(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

然而,这样做是可行的:

储存库:

代码语言:javascript
复制
@Repository
interface WorkplaceRepository : JpaRepository<Workplace, Long>

该处

代码语言:javascript
复制
@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()
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-26 08:38:58

我认为这与https://github.com/querydsl/querydsl/pull/3076修复的bug有关,但还没有进入发布版。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70117634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档