Spring data couchbase документирует наследование классов Java

Моя проблема в том, что база данных 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.

Привет, Томас. Вы нашли способ сделать это с помощью Spring Data Couchbase?

Nickolas 27.12.2018 05:53

Помогает ли там мой ответ? stackoverflow.com/questions/42636774/…

Tom 18.09.2019 17:07
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
402
2

Ответы 2

Рассмотрим универсальный интерфейс, основанный на наследовании.

Сначала создайте суперкласс:

@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. Есть что-то такое же в весенней базе данных?

Tomáš Hariň 09.04.2018 11:05

Нам удалось проделать эту работу на 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.

Надеюсь, это поможет, и никто не должен больше терять время на это. :)

Другие вопросы по теме