Можно ли определить репозиторий для абстрактного класса в 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);
}