Я делаю приложение для книжного магазина, используя Spring Boot и Spring
Данные. Мне нужна поддержка, чтобы знать, правильно ли я поступил или нет.
Я делаю REST-приложение для Книжного магазина, используя Spring Boot и Spring Data. Я только начал с этого и застрял в точке. Хотя я добился (пользовательский запрос - присоединение) того, чего хотел, но я действительно хотел бы знать, является ли то, что я сделал, правильным или есть лучший подход для этого.
Вот три класса сущностей:
Книга:
@Entity
@Table(name="Book_Details")
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="CUSTOM_SEQUENCE")
@SequenceGenerator(sequenceName = "customer_seq", allocationSize = 1, name = "CUSTOM_SEQUENCE")
@Column(name="BookId")
int bookId;
public int getBookId() {
return bookId;
}
public void setBookId(int bookId) {
this.bookId = bookId;
}
@Column(name="BookName")
String bookName;
@OneToOne(fetch=FetchType.LAZY)
@JoinColumn(name="authorId")
Author author;
@Column(name="Language")
String language;
@OneToOne(fetch=FetchType.LAZY)
@JoinColumn(name="genreId")
Genre genre;
@Column(name="GoodReadReviews")
String goodReadReviews;
//To display values
@Override
public String toString() {
return "BookId=" + this.bookId + "::BookName=" + this.bookName +
"::AuthorId=" + this.author.authorName +
"::Langauge = " + this.language + "::GenreId = " +
this.genre.genreName + "::GoodReadReviews=" +
this.goodReadReviews;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
public String getGoodReadReviews() {
return goodReadReviews;
}
public void setGoodReadReviews(String goodReadReviews) {
this.goodReadReviews = goodReadReviews;
}
public Author getAuthor() {
return author;
}
public void setAuthor(Author author) {
this.author = author;
}
public Genre getGenre() {
return genre;
}
public void setGenre(Genre genre) {
this.genre = genre;
}
}
Автор:
@Entity
@Table(name="Author_Details")
public class Author {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator="AuthorSeqGenerator")
@SequenceGenerator(sequenceName = "author_seq", allocationSize = 1, name
= "AuthorSeqGenerator")
@Column(name="AuthorId")
int authorId;
@Column(name="AuthorName")
String authorName;
@Column(name="Country")
String country;
@Column(name="Gender")
String gender;
@OneToOne(mappedBy="author")
@JoinColumn(name="authorId")
private Book book;
public Book getBook() {
return book;
}
public void setBook(Book book) {
this.book = book;
}
public int getAuthorId() {
return authorId;
}
public void setAuthorId(int authorId) {
this.authorId = authorId;
}
public String getAuthorName() {
return authorName;
}
public void setAuthorName(String authorName) {
this.authorName = authorName;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
Жанр:
@Entity
@Table(name="Genre_details")
public class Genre {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator="GenreSeqGenerator")
@SequenceGenerator(sequenceName = "genre_seq", allocationSize = 1, name =
"GenreSeqGenerator")
int genreId;
@Column(name="GenreName")
String genreName;
@OneToOne(mappedBy="genre")
private Book book;
public Book getBook() {
return book;
}
public void setBook(Book book) {
this.book = book;
}
public int getGenreId() {
return genreId;
}
public void setGenreId(int genreId) {
this.genreId = genreId;
}
public String getGenreName() {
return genreName;
}
public void setGenreName(String genreName) {
this.genreName = genreName;
}
}
Ниже приведен основной класс приложений Spring-boot:
@SpringBootApplication
public class BookStoreManagerApplication implements CommandLineRunner{
public static void main(String[] args) {
SpringApplication.run(BookStoreManagerApplication.class, args);
}
@Autowired
DataSource dataSource;
@Autowired
BookRepository bookRepository;
//@Transactional(readOnly=true)
@Override
public void run(String... args) throws Exception {
System.out.println("DATASOURCE = " + dataSource);
System.out.println("1.) Find By Book Id = " );
for(Book book:bookRepository.findByBookId(1)) {
System.out.println(book.toString());
}
System.out.println("2.) Find By Book Name = ");
for(Book book:bookRepository.findByBookName("Pinjar")) {
System.out.println(book.toString());
}
System.out.println("3.) Find All = " );
for(Book book:bookRepository.findAll()) {
System.out.println(book.toString());
}
System.out.println("4.) Custom Query using @Query annotation = " );
for(Object[] joinResult: bookRepository.findByAuthorIdAndGenreId(1, 1)){
System.out.println(joinResult[0] + "::" + joinResult[1] + "::" +
"::" + joinResult[2] + "::" + joinResult[3] + "::" + joinResult[4] +
"::" + joinResult[5] + "::" + joinResult[6] + "::" + joinResult[7]);
}
System.out.println("Check if tables are created!");
}
}
Вот хранилище книг:
public interface BookRepository extends CrudRepository<Book, String>{
List<Book> findByBookId(int id);
//List<Book> findByAuthorId(int authorId);
List<Book> findByLanguage(String lang);
//List<Book> findByGenreId(int genreId);
List<Book> findByGoodReadReviews(String reviews);
List<Book> findByBookName(String bookName);
List<Book> findAll();
//Stream<Book> findAllByStream();
@Query("select b.bookId, b.bookName, a.authorId, a.authorName, b.language, "
+ "g.genreId, g.genreName,b.goodReadReviews from Book b, Author a, "
+ "Genre g where b.author=a.authorId and b.genre=g.genreId and "
+ "a.authorId=?1 and g.genreId=?2")
List<Object[]> findByAuthorIdAndGenreId(int authorId, int genreId);
}
Все это работает нормально, но для вышеприведенного запроса соединения используется
@Query аннотация, я хочу знать, если это правильный подход, или я
можно использовать лучший подход. Я извиняюсь за наивность этого
вопрос.
Результат выглядит следующим образом:
1.) Find By Book Id =
2019-01-22 17:02:40 DEBUG org.hibernate.SQL - select book0_.book_id as book_id1_1_, book0_.author_id as author_id5_1_, book0_.book_name as book_name2_1_, book0_.genre_id as genre_id6_1_, book0_.good_read_reviews as good_read_reviews3_1_, book0_.language as language4_1_ from book_details book0_ where book0_.book_id=?
BookId=1::BookName=Tuesdays With Morrie::AuthorId=null::Langauge = English::GenreId = null::GoodReadReviews=4.5
2.) Find By Book Name =
2019-01-22 17:02:40 DEBUG org.hibernate.SQL - select book0_.book_id as book_id1_1_, book0_.author_id as author_id5_1_, book0_.book_name as book_name2_1_, book0_.genre_id as genre_id6_1_, book0_.good_read_reviews as good_read_reviews3_1_, book0_.language as language4_1_ from book_details book0_ where book0_.book_name=?
BookId=2::BookName=Pinjar::AuthorId=null::Langauge = Punjabi::GenreId = null::GoodReadReviews=4.8
3.) Find All =
2019-01-22 17:02:40 DEBUG org.hibernate.SQL - select book0_.book_id as book_id1_1_, book0_.author_id as author_id5_1_, book0_.book_name as book_name2_1_, book0_.genre_id as genre_id6_1_, book0_.good_read_reviews as good_read_reviews3_1_, book0_.language as language4_1_ from book_details book0_
BookId=1::BookName=Tuesdays With Morrie::AuthorId=null::Langauge = English::GenreId = null::GoodReadReviews=4.5
BookId=2::BookName=Pinjar::AuthorId=null::Langauge = Punjabi::GenreId = null::GoodReadReviews=4.8
BookId=3::BookName=Raavi Paar::AuthorId=null::Langauge = Hindi::GenreId = null::GoodReadReviews=4.6
4.) Custom Query using @Query annotation =
2019-01-22 17:02:40 DEBUG org.hibernate.SQL - select book0_.book_id as col_0_0_, book0_.book_name as col_1_0_, author1_.author_id as col_2_0_, author1_.author_name as col_3_0_, book0_.language as col_4_0_, genre2_.genre_id as col_5_0_, genre2_.genre_name as col_6_0_, book0_.good_read_reviews as col_7_0_ from book_details book0_ cross join author_details author1_ cross join genre_details genre2_ where book0_.author_id=author1_.author_id and book0_.genre_id=genre2_.genre_id and author1_.author_id=? and genre2_.genre_id=?
1::Tuesdays With Morrie::::1::Mitch Albom::English::1::Fiction::4.5