Моя проблема в том, что база данных spring не ищет подклассы искомого класса. Например:
Модель:
@Document
class A {
@Id
String id
}
@Document
class B extends A {}
И репозиторий:
public interface ARepository extends PagingAndSortingRepository<A, String>{
Page<A> findAll(Pageable pageable);
}
Spring data couchbase генерирует запрос, который находится в состоянии where
_class = "com.example.model.A"
Но я хочу также искать в этом запросе документы B. Как я могу это сделать? Когда я пишу собственный запрос, я должен определить порядок, ограничение и смещение в запросе, а Pageable не используется. Но я хочу использовать Pageable.
Помогает ли там мой ответ? stackoverflow.com/questions/42636774/…




Рассмотрим универсальный интерфейс, основанный на наследовании.
Сначала создайте суперкласс:
@Inheritance
public abstract class SuperClass{
@Id
private int id;
}
Затем создайте свои подклассы:
public class A extends SuperClass { /* ... */ }
public class B extends SuperClass { /* ... */ }
Создать базовый репозиторий:
@NoRepositoryBean
public interface SuperClassBaseRepository<T extends SuperClass>
extends PagingAndSortingRepository<T, Integer> {
public T findAll();
}
А затем создайте репозиторий SuperClass на основе базового репо:
@Transactional
public interface SuperClassRepository extends SuperClassBaseRepository<SuperClass> { /* ... */ }
@Transactional
public interface ARepository extends SuperClassBaseRepository<A> { /* ... */ }
@Transactional
public interface BRepository extends SuperClassBaseRepository<B> { /* ... */ }
SuperClassRepository findAll() будет искать все классы A и B
Спасибо за помощь, но это возможно только в весенних данных JPA. В базе данных Spring нет аннотации @Inheritance. Есть что-то такое же в весенней базе данных?
Нам удалось проделать эту работу на Spring Data Couchbase 3.2.12. Вот что мы сделали:
Мы выяснили, что сопоставители для каждого типа создавались только в том случае, если для этого типа существовал репозиторий, поэтому, помимо репозитория суперкласса ...
public interface ARepository extends PagingAndSortingRepository<A, String> {
Page<A> findAll(Pageable pageable);
}
Мы создали пустой репозиторий для каждого из подтипов, таких как:
public interface BRepository extends PagingAndSortingRepository<B, String>{
// No methods
}
Присутствие этого второго репо гарантировало существование подходящего средства отображения для B, поэтому, когда findAll (или другие методы) вызываются в ARepository, отображается средство отображения для каждого подкласса. Сделав это, мы смогли получить список A, которые на самом деле были экземплярами B.
Надеюсь, это поможет, и никто не должен больше терять время на это. :)
Привет, Томас. Вы нашли способ сделать это с помощью Spring Data Couchbase?