【问题标题】:How do you write a repository query in Spring boot to filter by an association key?如何在 Spring Boot 中编写存储库查询以通过关联键进行过滤?
【发布时间】:2021-02-17 14:51:33
【问题描述】:

如何在存储库接口中编写查询来执行 WHERE assoc_id = :key?

我有一个名为CmsImpacts 的实体,然后我有一个调用ImpactsRepository 的服务,如下所示:

    import java.util.List;
    
    public interface ImpactsRepository<T extends CmsImpacts> extends BaseCmsRepository<CmsImpacts> {
        
        @Query("SELECT a FROM #{#entityName} a where a.scenarioId = :scenarioId")
        List<CmsImpacts> getByScenarioPaged(
                Integer scenarioId,
                Pageable pageable
        );
        
        @Query("SELECT COUNT(a.id) FROM #{#entityName} a where a.scenarioId = :scenarioId")
        Integer getAsScenarioCount(
                Integer scenarioId
        );
        
        
        
    }

这种关系的要点是CmsScenariosCmsImpacts 上的一对多。实体关系定义为:

    
    @JsonIgnore
    @JsonBackReference
    @JoinColumn(name = "scenario_id", referencedColumnName = "id")
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private CmsScenarios scenarioId;

每当我调用我的服务并传入scenario_id 的整数值时,它都会抛出一个TypeException,因为(理所当然地)需要一个CmsScenario 对象,而不是整数。

错误消息:2020-11-04 15:10:45.764 ERROR 128396 --- [io-8080-exec-18] osbwservlet.support.ErrorPageFilter : 从请求转发到错误页面[/api/impacts/list/scenario/2] 由于异常 [org.springframework.dao.InvalidDataAccessApiUsageException: 参数值 [2] 与预期类型不匹配 [com.vw.asa.entities.cms.CmsScenarios (n/a )];嵌套异常是 java.lang.IllegalArgumentException:参数值 [2] 与预期类型不匹配 [com.vw.asa.entities.cms.CmsScenarios (n/a)]]

我需要做什么才能执行此查询?这也适用于上面的查询,即分页计数器。

注意:

我不想只检索CmsScenarios 对象并调用getImpacts(),这将返回所有对象,我需要能够对它们进行分页。

【问题讨论】:

  • 您能否在查询中尝试使用 a.scenarioId.id 代替 a.scenarioId

标签: java spring-boot jpa repository


【解决方案1】:

你必须添加相关实体的id

@Query("SELECT a FROM #{#entityName} a where a.scenarioId.id = :scenarioId")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-09-22
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 2019-06-18
    • 2020-08-02
    相关资源
    最近更新 更多