Ответ 1
Это имя метода должно выполнить трюк:
Page<QueuedBook> findByBookIdRegion(Region region, Pageable pageable);
Подробнее об этом в разделе вывод запроса справочных документов.
Я хочу написать сигнатуру метода интерфейса репозитория данных JPA Spring, которая позволит мне найти объекты с свойством внедренного объекта в этом объекте. Кто-нибудь знает, возможно ли это, и если да, то как?
Здесь мой код:
@Entity
@Table(name = "BOOK_UPDATE_QUEUE", indexes = { uniqueConstraints = @UniqueConstraint(columnNames = {
"bookId", "region" }, name = "UK01_BOOK_UPDATE_QUEUE"))
public class QueuedBook implements Serializable {
@Embedded
@NotNull
private BookId bookId;
...
}
@Embeddable
public class BookId implements Serializable {
@NotNull
@Size(min=1, max=40)
private String bookId;
@NotNull
@Enumerated(EnumType.STRING)
private Region region;
...
}
public interface QueuedBookRepo extends JpaRepository<QueuedBook, Long> {
//I'd like to write a method like this, but can't figure out how to search by region,
//when region is actually a part of the embedded BookId
Page<QueuedBook> findByRegion(Region region, Pageable pageable);
}
Можно ли написать запрос для этого, используя Spring Data?
Это имя метода должно выполнить трюк:
Page<QueuedBook> findByBookIdRegion(Region region, Pageable pageable);
Подробнее об этом в разделе вывод запроса справочных документов.
Вышеуказанный - findByBookIdRegion() не работал у меня. Ниже приведена последняя версия String Data JPA:
Page<QueuedBook> findByBookId_Region(Region region, Pageable pageable);
Если вы используете BookId в качестве комбинированного первичного ключа, не забудьте изменить свой интерфейс с:
public interface QueuedBookRepo extends JpaRepository<QueuedBook, Long> {
чтобы:
public interface QueuedBookRepo extends JpaRepository<QueuedBook, BookId> {
И измените аннотацию @Embedded на @EmbeddedId в своем классе QueuedBook следующим образом:
public class QueuedBook implements Serializable {
@EmbeddedId
@NotNull
private BookId bookId;
...
По моему мнению, Spring не справляется со всеми делами с легкостью. В вашем случае следующее должно сделать трюк
Page<QueuedBook> findByBookIdRegion(Region region, Pageable pageable);
или же
Page<QueuedBook> findByBookId_Region(Region region, Pageable pageable);
Однако это также зависит от соглашения об именах полей, которые есть в вашем классе @Embeddable
,
например, следующее поле может не работать ни в одном из стилей, упомянутых выше
private String cRcdDel;
Я попытался в обоих случаях (как показано ниже), и это не сработало (кажется, что Spring не обрабатывает соглашения об именах такого типа (т.е. для многих заглавных букв, особенно в начале - 2-я буква (не уверен, что это так). единственный случай, хотя)
Page<QueuedBook> findByBookIdCRcdDel(String cRcdDel, Pageable pageable);
или же
Page<QueuedBook> findByBookIdCRcdDel(String cRcdDel, Pageable pageable);
Когда я переименовал столбец в
private String rcdDel;
мои следующие решения работают нормально без каких-либо проблем:
Page<QueuedBook> findByBookIdRcdDel(String rcdDel, Pageable pageable);
ИЛИ ЖЕ
Page<QueuedBook> findByBookIdRcdDel(String rcdDel, Pageable pageable);