2017-08-09 1 views
0

J'essaie de créer la méthode de référentiel afin que je puisse montrer, tout en accédant aux détails du livre de tous ses auteurs (et vice versa). Il est beaucoup à beaucoup relation, et les classes de modèle ressemble à ceci:HQL many to many référentiel méthode

Auteur (modèle) Classe:

@Entity 
@Table(name = "author") 
public class Author { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "author_id") 
    private int authorId; 
    @Column(name = "name") 
    private String name; 
    @Column(name = "surname") 
    private String surname; 
    @Column(name = "date_of_birth") 
    private Date dateOfBirth; 

    @Column(name = "alive") 
    private boolean alive; 

    @ManyToMany(cascade = CascadeType.ALL, mappedBy="authors") 
    @JoinTable(name = "book_author", 
      joinColumns = @JoinColumn(name = "book_id"), 
      inverseJoinColumns = @JoinColumn(name = "author_id")) 
    private Set<Book> books = new HashSet<Book>(); 

classe

@Entity 
@Table(name = "book") 
public class Book { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "book_id") 
    private int bookId; 
    @Column(name = "isbn") 
    private long isbn; 
    @Column(name = "title") 
    private String title; 
    @Column(name = "title_original") 
    private String titleOriginal; 
    @Column(name = "premiere_date") 
    private Date premiereDate; 
    @ManyToMany(cascade = CascadeType.ALL, mappedBy="books") 
    @JoinTable(name = "book_author", joinColumns = { @JoinColumn(name = "book_id") }, inverseJoinColumns = { @JoinColumn(name = "author_id") }) 
    private Set<Author> authors = new HashSet<Author>(0); 

BookRepository Livre (modèle) classe:

@Repository 
public interface BookRepository extends CrudRepository<Book, Integer> { 

    List<Book> findByIsbn(@Param("isbn") long isbn); 
    List<Book> findByTitle(@Param("title") String title); 
    List<Book> findByTitleOriginal(@Param("titleOriginal") String titleOriginal); 
    @Query("SELECT b FROM Book b WHERE b.premiereDate BETWEEN :startYear AND :endYear ORDER BY b.premiereDate") 
    public List<Book> getBooksBetweenDate(@Param("startYear")int startYear, @Param("endYear")int endYear); 




@Query("SELECT b FROM Book b JOIN b.authors a WHERE a.authorId =:idAuthor") 
public List<Book> getBookAuthors(???) 

Je pense que ma classe de modèle et hql requête dans le référentiel sont OK, mais je ne sais pas comment créer la méthode getBookAuthors.

Nous vous remercions de votre aide à l'avance.

+0

id n'a pas de sens, que voulez-vous dire par obtenir auteurs de livres? vous devez retourner des livres écrits par une anthère? –

+0

obtenir des auteurs de livres, parce qu'un livre peut avoir de nombreux auteurs –

+0

vérifier ma réponse, vous voulez retourner ensemble d'auteurs pour un livre, ne pas retourner la liste des livres –

Répondre

2

vous devez spécifier la jointure table une fois côté (le côté entité propriétaire) et mappedBy de l'autre côté, si Parexemple dans votre entité du livre

@ManyToMany(cascade = CascadeType.ALL. mappedBy="books") 
    private Set<Author> authors = new HashSet<Author>(0); 

Alors maintenant, vous avez une relation bidirectionnelle entre livre et auteur, si vous voulez récupérer les auteurs d'un livre tout ce que vous avez besoin est de récupérer le livre en utilisant votre référentiel, puis obtenir son auteur

Book book = BookRepository.findOne(bookId);//bookId contains the id of your book 
Set<Author> authors = book.getAuthors();//im supposing you have getter for your authers in Book class 
+0

après avoir ajouté cela, comment puis-je faire fonctionner ma méthode getBookAuthors? –

+0

également, édité le message original –

+0

@TylerDurden J'ai édité la réponse, est-ce que vous avez besoin? –