Я выполнил сопоставление jpa one to many между книгой и соответствующими страницами следующим образом.
@Entity
@Getter
@Setter
@NoArgsConstructor
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class Book {
@Id
@EqualsAndHashCode.Include
@Column(name = "book_id")
private String bookId;
private String name;
@OneToMany(targetEntity = Page.class, cascade= CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "book_id_fk", referencedColumnName = "book_id")
private List<Page> pages;
}
и
@Entity
@Getter
@Setter
@NoArgsConstructor
public class Page {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer sno;
private Integer number;
}
@Repository
public interface PageRepository extends JpaRepository<Page, Integer> {
List<Page> findAllByBook_Id(String bookId);
}
Теперь я хотел бы получить все страницы, используя идентификатор книги из таблицы страниц. Для этого я использую метод findAllBook_id, но получаю исключение No property book found for type Page!
. Я пробовал имена методов XXXBook_fkId/XXXBookFkId/XXXBook_fk_id и т. д., но ничего не вышло. Пожалуйста, помогите
Проблема, с которой вы сталкиваетесь, заключается в том, что в вашем entity
Page
нет поля, связанного с Book
. Итак, у вас есть однонаправленное отображение на уровне JPA.
Одним из решений может быть включение следующего пользовательского запроса, который вернет вам то, что вы ожидаете получить.
@Query( "SELECT pg FROM Book bk join bk.pages pg WHERE bk.bookId = :bookId")
List<Page> findPagesByBookId(@Param("bookId") String bookId);
@Rajeev, тогда вам следует реализовать двунаправленную связь для объекта Page
и использовать это как поле в имени метода jpa.
Спасибо. Это работает, но есть ли способ добиться того же, используя аннотацию запроса? Я имею в виду, можем ли мы использовать пользовательские методы (которые внутренне генерируют этот запрос)? Пожалуйста, предоставьте свои материалы