有没有办法为相同的结构表复制 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");
一些上下文:我使用了五个具有相同结构的 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");