2017-07-09 3 views
1

著者に関連付けられた書籍を見つけるために、著者として整数を渡すときに、どのようにクエリを実行しますか?私は以下のものを私に 'アソシエーションIDではない'としました。これを行う正しい方法は何ですか?hqlの代わりに学習基準、どのようにオブジェクトのリストで条件manytomanyを使用してクエリですか?

また、この多対多は、書籍のauthors属性のアノテーションに基づいて3番目のテーブルを作成しました。望ましい行動

public List<Book> getBooksByAuthorId(int authorId) { 
     Session session = HibernateUtil.getSession(); 
     Criteria cr = session.createCriteria(Book.class, "book"); 
     cr.createAlias("book.authors", "authors"); 
     cr.createAlias("authors.id", "authid"); 
     cr.add(Restrictions.eq()) //edited after initial post this line should be removed 

     cr.add(Restrictions.eq("auth.id", authorId)); 
     List<Book> results = cr.list(); 
     session.close(); 
     return results; 
    } 
+0

は、あなたがあなたのクエリで達成しようとしている正確に何を説明することはできますか? 多対多リレーションシップは中間テーブルを使用してマップする必要があるため、取得するビヘイビアは正しいです。 – fg78nc

+0

この場合、int(authorid)の引数、またはそれより優れた文字列を渡すと、その著者に関連付けられている書籍のリストを返したいと思います。だから私はそれらの本のリストを印刷することができます。 – teknotrance

+0

下記の回答をご覧ください – fg78nc

答えて

0

をやっ

エンティティ

@Entity 
class Book{ 
    @Id 
    @GeneratedValue 
    private Integer id; 

    @ManyToMany(cascade = CascadeType.ALL) 
    @Column(name="Authors") 
    @JoinTable(name = "author_book", joinColumns = 
    { @JoinColumn(name = "authors_id") }, 
    inverseJoinColumns = { @JoinColumn(name = "books_id") }) 
    private List<Author> authors; 

    //getters-setters 
} 

@Entity 
class Author{ 
    @Id 
    @GeneratedValue 
    private Integer id; 
    private String name; 

     @ManyToMany(mappedBy = "authors",cascade = CascadeType.ALL) 
    private List<Book> books; 

    //getters-setters 
} 

機能してみてください:

を私はJPA基準のAPIを提案することができます(HibernateのクライテリアAPIと異なります) HibernateのクライテリアAPIが考慮されます現在は推奨されていません。著者IDを供給することにより、著者に関連した図書のリストを取得するには

CriteriaBuilder cb = entityManager.getCriteriaBuilder(); 

    CriteriaQuery cq = cb.createQuery(); 
    Root book = cq.from(Book.class); 
    // // declaring parameter 'authorId' 
    cq.where(cb.equal(book.get("id"), cb.parameter(Integer.class, "authorId")); 
    Query query = em.createQuery(cq); 
     // supplying parameter 'authorId' to query 
    query.setParameter("authorId", id); 
    List<Author> authors = query.getResultList(); 
関連する問題