如何在spring queryDSL中为一个列表建立谓词?

问题描述 投票:0回答:1
    Service.java

    private String sid;
    private String serviceName;
    private List<Feature> feature;

    Feature.java

    private Long id;
    private String featureName;

我建立的谓词如下

     import com.querydsl.core.BooleanBuilder;
     import com.querydsl.core.types.Predicate;

     BooleanBuilder booleanBuilder = new BooleanBuilder();
     booleanBuilder.and(QService.service.id.eq(id));
     booleanBuilder.and(QFeature.feature.usoc.eq(featureUsoc));

     Predicate predicate = booleanBuilder;

     serviceRepository.findAll(predicate);

当我查询repo时,我得到以下错误信息

nested exception is java.lang.IllegalArgumentException: org.hibernate.QueryException: illegal attempt to dereference collection [{synthetic-alias}{non-qualified-property-ref}feature] with element property reference [featureName] [select service
from com.ws.app.model.Service service
where service.id = ?2 and feature.featureName = ?3]]

如果实体中的变量是List类型,如何为其建立谓词查询?

spring-data-jpa querydsl
1个回答
0
投票

你需要一个JOIN或子查询到相关的路径。

query().from(QService.service)
    .where(QService.service.id.eq(id))
    .where(query().from(QService.service.feature, QFeature.feature)
          .where(QFeature.feature.usoc.eq(featureUsoc))
          .exists())
    .fetch()

Join:

query().from(QService.service)
    .innerJoin(QService.service.feature, QFeature.feature)
    .on(QFeature.feature.usoc.eq(featureUsoc))
    .where(QService.service.id.eq(id))
    .fetch()
© www.soinside.com 2019 - 2024. All rights reserved.