【问题标题】:crnk subrelation filtering allowed?crnk 子关系过滤允许吗?
【发布时间】:2018-12-12 16:47:39
【问题描述】:

我们将 crnk 用于 json-api,将服务器端作为客户端实现。
jpa 绑定的服务器实现是否支持子关系过滤器?
我们希望过滤在特定开始时间之后有事件的所有系列。

我们分离了 json-api 和 JPA 实体类。请参阅下面的 json-api 作为实体类

例如我使用的 url(由 crnk 客户端代码生成):

EpgShow?include[EpgShow]=titles&filter[EpgShow][titles.startTime][GE]=2018-05-04T12:30:22+02:00

我们收到的错误是:

{
    errors: [
        {
            status: "500",
            title: "INTERNAL_SERVER_ERROR",
            detail: "failed to resolve path [titles, startTime]"
        }
    ]
}

类实现:

@JsonApiResource(type = "EpgShow")
public class EpgSeriesDto {

    @JsonApiId
    private Integer serieId;

    @JsonApiRelation(opposite = "epgShow", lookUp = LookupIncludeBehavior.AUTOMATICALLY_WHEN_NULL, serialize = SerializeType.ONLY_ID, repositoryBehavior = RelationshipRepositoryBehavior.FORWARD_OWNER)
    private Set<EpgTitleDto> titles;
}

@JsonApiResource(type = "EpgTitle")
@Data
public class EpgTitleDto {
    @JsonApiId
    private Long id;

    @JsonApiRelation(opposite = "titles", lookUp = LookupIncludeBehavior.AUTOMATICALLY_WHEN_NULL, serialize = SerializeType.ONLY_ID)
    private EpgSeriesDto epgShow;
}

@Entity
public class Serie {
    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "serie_id", unique = true, nullable = false)
    private Integer serieId;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "epgShow")
    private Set<Event> titles = new HashSet<Event>(0);
}

@Entity
public class Event {

    @Column(name = "start_time")
    private ZonedDateTime startTime;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "serie_id")
    private Serie epgShow;
}

【问题讨论】:

    标签: jpa json-api crnk


    【解决方案1】:

    共有三种不同的过滤器:

    • 过滤包含的关系(但不包括请求的/主要资源)
    • 根据位于单值关系上的属性过滤请求资源类型。
    • 根据位于多值关系上的属性过滤请求资源类型。

    前两种都支持,目前还没有直接支持最后一种。对于后者,到目前为止它支持“计算”属性,其中值来自允许任意复杂 SQL 的 Criteria API 或 QueryDSL 表达式。反过来,它们可以再次返回一个可以过滤和排序的简单结果。在本例中,这可能是主资源上的 minStartTime 和 maxStartTime。

    但如果需要,还可以添加对过滤多值关系的支持。一种可能是使用 EXISTS 子查询。或者更高级的可能支持不同的策略。欢迎在这方面提出 PR。

    【讨论】:

      猜你喜欢
      • 2020-03-03
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      • 2017-07-23
      • 2014-07-05
      • 1970-01-01
      • 2018-03-01
      • 2015-01-24
      相关资源
      最近更新 更多