上下文的上下文:我正在使用五个具有相同结构的表,如下所示:
@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个相同的查询。
你们都有解决方案吗?
这就是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);
}