Могу ли я определить репозиторий для абстрактного класса в spring-data-couchbase? - PullRequest
1 голос
/ 27 марта 2020

Можно ли определить репозиторий для абстрактного класса в spring-data-couchbase? А если нет, то планируете ли вы добавить эту возможность в будущем? Это было бы очень полезно для моей команды ...

Чтобы немного рассказать о моем случае использования ...

(В Spring-boot 2.1.11.RELEASE и spring-data-couchbase 3.2.25.RELEASE) В настоящее время, если я определяю spring-data-couchbase CouchbasePagingAndSortingRepository для абстрактного класса, единственный найденный мной метод, который возвращает любые результаты, это findById(), и, насколько я могу судить, это только работает, потому что в библиотеке есть ошибка, которая забывает включить выражение _class = 'fully.qualified.ClassName' where при генерации запроса findById().

На самом деле, в Джексоне уже есть аннотация для определения, как включить java имя класса в сериализованном JSON - @JsonTypeInfo, @JsonSubTypes и @JsonTypeName. Будет ли у Spring-data-couchbase возможность использовать эти аннотации или создать что-то подобное?

Наш вариант использования заключается в том, что мы храним несколько тесно связанных, но немного разных типов документов в одной корзине Couchbase. , Иногда мы хотим запускать запросы для определенного подтипа c, но в большинстве случаев мы хотели бы выполнять запросы для всех подтипов. Конечно, мы всегда можем использовать пользовательские N1QL-запросы через корзину couchbase, но было бы неплохо, если бы spring-data-couchbase понимала аннотации Джексона, поскольку Spring уже использует их для визуализации ответов в контроллерах. Это кажется довольно полезной потенциальной возможностью для spring-data-couchbase, если это уже не функция ...

Вот иллюстрация того, что мы хотели бы с помощью кода:

@Data
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "javaClass")
@JsonSubTypes({
        @JsonSubTypes.Type(value = Bird.class, name = "Bird"),
        @JsonSubTypes.Type(value = Cat.class, name = "Cat")
})
public abstract class Creature implements Serializable {
    protected static final long serialVersionUID = -1L;

    @Id
    protected String id;
    protected Integer height;
    protected Classification classification;
}
@Data
@Document
@JsonTypeName("Bird")
@NoArgsConstructor
public class Bird extends Creature {
    private static final long serialVersionUID = -1L;

    private Integer wingspan;
}
@Data
@Document
@JsonTypeName("Cat")
@NoArgsConstructor
public class Cat extends Creature {
    private static final long serialVersionUID = -1L;

    private Integer numLives;
}

И затем, чтобы иметь возможность определять репозитории следующим образом:

@Repository
@N1qlPrimaryIndexed
@ViewIndexed(designDoc = "creature")
public interface CreatureRepository extends CouchbasePagingAndSortingRepository<Creature, String> {
    Optional<Creature> findByHeight(Integer height);
    Optional<Creature> findByClassification_Genus(String genus);
}
@Repository
@N1qlPrimaryIndexed
@ViewIndexed(designDoc = "cat")
public interface CatRepository extends CouchbasePagingAndSortingRepository<Cat, String> {
    Optional<Cat> findByHeight(Integer height);
    Optional<Cat> findByNumLives(Integer numLives);
}
...