有没有办法为相同的结构表复制 JPARepository 方法?

Is there a way to replicate JPARepository methods for same structure tables?

一些上下文:我使用了五个具有相同结构的 table,如下所示:

@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;

}

然后所有五个 table 看起来像这样:

@Data
@Entity

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

我想获得关于 table 的正确 bookId。5 个 table 是强制性的。 我的存储库如下所示:

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

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

}

我认为通过对 Jpa "hey, the request comes from Fantastic / Horror Book so you should use the method in their respective table" 说通配符会有所帮助。 但事实并非如此。如果我 运行 这个,结果是:

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

但是我的电话是这样的:

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

我在这里的解释是,我在所有 5 table 中都有这个 "BookId" 来测试数据。这意味着,使用通配符,它​​实际上会查看 Book.class 的每个子项,这是我不想要的。 有没有办法绕过这个?

此外,我的解决方案是像这样制作回购协议:

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

    List<MedivalBook> findByBookId(String bookId);

}

但如果我这样做,我将无法进行 5 个相同的查询。

你们有解决办法吗?

这就是 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");