Java 查询DSL-如何按集合中的元素分组/检索元素

Java 查询DSL-如何按集合中的元素分组/检索元素,java,collections,spring-data-jpa,querydsl,Java,Collections,Spring Data Jpa,Querydsl,在我的场景中,我需要根据集合中的字段进行检索和分组 这些是课程 class EntityA { //some other properties @OneToOne(fetch = FetchType.LAZY, mappedBy = "entityA") @org.hibernate.annotations.LazyToOne(org.hibernate.annotations.LazyToOneOption.NO_PROXY) EntityB ent

在我的场景中,我需要根据集合中的字段进行检索和分组

这些是课程

class EntityA {

     //some other properties

     @OneToOne(fetch = FetchType.LAZY, mappedBy = "entityA")
     @org.hibernate.annotations.LazyToOne(org.hibernate.annotations.LazyToOneOption.NO_PROXY)
     EntityB entityB;

}

class EntityB {

    //some other properties

    @org.hibernate.annotations.Cache(usage = org.hibernate.annotations.CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    @OneToMany(cascade = { CascadeType.ALL }, mappedBy = "entityB", orphanRemoval = true)
    @org.hibernate.annotations.BatchSize(size = 30)
    @Getter
    private final Set<EntityC> entityCs = new LinkedHashSet<>();

}

class EntityC {

    //some other properties

    @NotNull
    @Column(name = "field1")
    @Setter
    private Integer field1;

}
到EntityA中entityB的getter,以允许前面提到的更长的初始化路径

我已经为独立字段做过这种类型的工作,效果很好。 但是,由于我试图检索/group by的字段位于集合中,并且我正在使用.any(),因此我不确定是否可以这样做

SpringDataJPA版本是1.9.2.0版本,并且 Mysema Querydsl版本是3.7.1

感谢您对此发表任何评论

     EntityASearchCriteria searchCriteria = new EntityASearchCriteria();


    QBean<EntityA> retrieveFields = Projections.bean(EntityA.class, 
                                        QEntityA.entityA.field2,
                                        QEntityA.entityA.entityB.entityCs.any().field1,
                                        QEntityA.entityA.field2.count().as("count"));

    QBean<EntityA> groupByFields = Projections.bean(EntityA.class,  
                                        QEntityA.entityA.entityB.entityCs.any().field1,
                                        QEntityA.entityA.field2);

    List<EntityA> returned = repo.findAll(retrieveFields,
            EntityARepoPredicate.getPredicate(searchCriteria),groupByFields, Boolean.TRUE, null);
    antlr.NoViableAltException: unexpected token: field1
        at org.hibernate.hql.internal.antlr.HqlBaseParser.groupByClause(HqlBaseParser.java:1179) [hibernate-core-4.3.11.Final.jar:4.3.11.Final]
        at org.hibernate.hql.internal.antlr.HqlBaseParser.queryRule(HqlBaseParser.java:759) [hibernate-core-4.3.11.Final.jar:4.3.11.Final]
        at org.hibernate.hql.internal.antlr.HqlBaseParser.selectStatement(HqlBaseParser.java:323) [hibernate-core-4.3.11.Final.jar:4.3.11.Final]
        at org.hibernate.hql.internal.antlr.HqlBaseParser.statement(HqlBaseParser.java:186) [hibernate-core-4.3.11.Final.jar:4.3.11.Final]
        at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:295) [hibernate-core-4.3.11.Final.jar:4.3.11.Final]
        at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:203) [hibernate-core-4.3.11.Final.jar:4.3.11.Final]
        at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:158) [hibernate-core-4.3.11.Final.jar:4.3.11.Final]
        at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:131) [hibernate-core-4.3.11.Final.jar:4.3.11.Final]
        at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:93) [hibernate-core-4.3.11.Final.jar:4.3.11.Final]
        at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:167) [hibernate-core-4.3.11.Final.jar:4.3.11.Final]
        at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:301) [hibernate-core-4.3.11.Final.jar:4.3.11.Final]
        at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:236) [hibernate-core-4.3.11.Final.jar:4.3.11.Final]
        at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1836) [hibernate-core-4.3.11.Final.jar:4.3.11.Final]
        at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:328) [hibernate-entitymanager-4.3.11.Final.jar:4.3.11.Final]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.7.0_79]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[?:1.7.0_79]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.7.0_79]
        at java.lang.reflect.Method.invoke(Method.java:606) ~[?:1.7.0_79]
        at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:293) [spring-orm-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at com.sun.proxy.$Proxy132.createQuery(Unknown Source) [?:?]
        at com.mysema.query.jpa.impl.AbstractJPAQuery.createQuery(AbstractJPAQuery.java:129) [querydsl-jpa-3.6.9.jar:?]
        at com.mysema.query.jpa.impl.AbstractJPAQuery.createQuery(AbstractJPAQuery.java:96) [querydsl-jpa-3.6.9.jar:?]
        at com.mysema.query.jpa.impl.AbstractJPAQuery.list(AbstractJPAQuery.java:248) [querydsl-jpa-3.6.9.jar:?]
        at my.mimos.jpa.repo.impl.BaseQueryDslJpaRepositoryImpl.findAll(BaseQueryDslJpaRepositoryImpl.java:264) [mimos-jpa-utils-1.0.11-SNAPSHOT.jar:?]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.7.0_79]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[?:1.7.0_79]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.7.0_79]
        at java.lang.reflect.Method.invoke(Method.java:606) ~[?:1.7.0_79]
        at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:483) [spring-data-commons-1.11.2.RELEASE.jar:?]
        at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:468) [spring-data-commons-1.11.2.RELEASE.jar:?]
        at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:440) [spring-data-commons-1.11.2.RELEASE.jar:?]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) [spring-aop-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) [spring-tx-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281) [spring-tx-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) [spring-tx-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) [spring-aop-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) [spring-tx-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) [spring-aop-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:131) [spring-data-jpa-1.9.2.RELEASE.jar:?]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) [spring-aop-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) [spring-aop-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) [spring-aop-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208) [spring-aop-4.2.4.RELEASE.jar:4.2.4.RELEASE]
        at com.sun.proxy.$Proxy140.findAll(Unknown Source) [?:?]
    @QueryInit({"entityB.entityCs"})