Есть ли способ реплицировать методы JPARepository для тех же структурных таблиц? - PullRequest
0 голосов
/ 04 марта 2020

Бит контекста: я использую пять таблиц с одинаковой структурой следующим образом:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Book {

    @Column(name = "BOOK_ID")
    private String bookId;

    @Column(name = "CUSTOMER_ID")
    private String customerId;

    @Column(name = "AUTHOR")
    private String author;

    @Column(name = "YEAR")
    private Integer year;

    @Id
    @Column(name = "ID")
    private Integer id;

}

Тогда все пять таблиц выглядят так:

@Data
@Entity

@Table(name = "FANTASTIC_BOOK")
public class FantasticBook extends Book {
}

Я хотел бы получить правильный bookId относительно таблицы, в которой он находится. 5 таблиц являются обязательными. Мой репозиторий выглядит так:

@Repository
public interface BookRepository extends JpaRepository<Book, Integer> {

    List<? extends Book> findByBookId(String bookId);

}

Я думал, что подстановочный знак поможет, сказав Jpa: «Эй, запрос исходит от Fantasti c / Книга ужасов, так что вы должны использовать метод в их соответствующей таблице» , Но это не так. Если я выполню это, результат будет:

[FantasticBook(), FantasticBook(), FantasticBook(), FantasticBook(), FantasticBook(), HorrorBook(), HorrorBook(), HorrorBook(), HorrorBook(), HorrorBook()]

Но мой вызов выглядит так:

MedievalBookList = (List<MedievalBook>) BookRepository.findByBookId(bookId);

Моя интерпретация здесь такова, что у меня есть этот "BookId" во всех 5 таблицах проверить данные. Это означает, что с подстановочным знаком он фактически просматривается в каждом дочернем элементе Book.class, чего я не хочу. Есть ли способ обойти это?

Кроме того, у меня было решение сделать репо следующим образом:

@Repository
public interface BookRepository extends JpaRepository<Book, Integer> {

    List<MedivalBook> findByBookId(String bookId);

}

Но если я сделаю это, я не смогу выполнить 5 одинаковых запросов.

У кого-нибудь из вас есть решение?

1 Ответ

0 голосов
/ 04 марта 2020

Так работает наследование JPA.

Если вы запрашиваете книгу, вы получаете все книги вкл. Подклассы, и если вы запрашиваете MedivalBook, вы получаете только MedivalBooks.

В качестве решения можно было бы использовать пользовательский запрос, например:

@Repository
public interface BookRepository extends JpaRepository<Book, Integer> {

    @Query("SELECT b FROM Book b WHERE TYPE(b) = :type and b.bookId = :bookId")
    List<Book> findByBookId(Class type, String bookId);

}

Тогда вызов будет:

findByBookId(MedivalBook.class, "The ID");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...