разрешена субреляционная фильтрация? - PullRequest
0 голосов
/ 04 июля 2018

Мы используем 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;
}

1 Ответ

0 голосов
/ 04 июля 2018

Есть три разных типа фильтров:

  • фильтрация включенных отношений (но не запрошенных / основных ресурсов)
  • фильтрация типа ресурса запроса на основе атрибута, расположенного в однозначных отношениях.
  • фильтрация типа ресурса запроса на основе атрибута, расположенного в многозначных отношениях.

поддерживаются первые два, но пока не последний напрямую. Для более поздних версий он до сих пор поддерживает «вычисляемые» атрибуты, где значение получено из Criteria API или выражения QueryDSL, которое допускает произвольный сложный SQL. Те, в свою очередь, могут вернуть простой результат, который можно отфильтровать и отсортировать. В этом примере это могут быть minStartTime и maxStartTime на основном ресурсе.

но при желании можно было бы также добавить поддержку фильтрации многозначных отношений. Одна возможность - использовать подзапросы EXISTS. Или более продвинутый может поддерживать разные стратегии. PR в этом отношении приветствовались бы.

...