【问题标题】:HQL many to many repository methodHQL 多对多存储库方法
【发布时间】:2018-01-17 07:45:47
【问题描述】:

我正在尝试创建存储库方法,以便在访问书籍的所有作者的详细信息时显示(反之亦然)。这是多对多的关系,模型类看起来像这样:

作者(模型)类:

@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>();

图书(模型)类

@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 类:

@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(???)

我认为我的模型类和存储库中的hql 查询没问题,但我不知道如何创建方法getBookAuthors

提前感谢您的帮助。

【问题讨论】:

  • id 没有意义,获取书籍作者是什么意思?你需要归还别人写的书吗?
  • 获取图书作者,因为一本书可以有多个作者
  • 检查我的答案,你想返回一本书的作者集,而不是返回书籍列表
  • 我认为您的SELECT b FROM Book b JOIN b.authors a WHERE a.authorId =:idAuthor 可以正常工作。您在执行此查询时是否遇到任何错误。
  • 我只是不知道现在如何使用此查询将什么参数传递给该方法

标签: java spring hibernate spring-data-jpa hql


【解决方案1】:

您需要在一侧(拥有实体一侧)指定连接表并在另一侧指定 mappedBy,例如在您的 Book 实体中

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

现在您在书籍和作者之间建立了双向关系,如果您想检索一本书的作者,您只需使用您的存储库检索该书,然后获取其作者

 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

【讨论】:

  • 添加之后,我怎样才能让我的方法 getBookAuthors 工作?
  • @TylerDurden 我编辑了答案,这是你需要的吗?
  • 是和否 :D 当然可以,但我仍然很好奇如何使用我创建的 hql 查询来修复我的 getBookAuthors 方法
  • 好的没关系,你的方法更好,谢谢你的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-19
  • 1970-01-01
相关资源
最近更新 更多