是否可以复制相同结构表的JPARepository方法?

问题描述 投票:0回答:1

上下文的上下文:我正在使用五个具有相同结构的表,如下所示:

@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说:“嘿,请求来自Fantastic / Horror Book,因此您应该在各自的表中使用该方法”。但事实并非如此。如果运行此命令,则结果为:

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

但是我的电话看起来像这样:

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

我的解释是,我在所有5个表中都有这个“ BookId”来测试数据。这意味着,使用通配符,它​​实际上会在Book.class的每个子级中查找,这是我不需要的。有办法绕过这个吗?

而且,我的解决方案是像这样制作仓库:

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

    List<MedivalBook> findByBookId(String bookId);

}

但是如果执行此操作,则无法进行5个相同的查询。

你们都有解决方案吗?

java spring jpa repository
1个回答
0
投票

这就是JPA继承的工作方式。

[如果您查询一本书,您将获得所有的书籍,包括子类,如果您查询MedivalBook,则只会得到MedivalBook。

解决方案可能是使用自定义查询,例如:

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

}
© www.soinside.com 2019 - 2024. All rights reserved.