【问题标题】:Spring Data JPA Property Expressions for a many to many query用于多对多查询的 Spring Data JPA 属性表达式
【发布时间】:2018-11-03 10:42:49
【问题描述】:

我正在使用带有 Spring Data 和 Spring Data JPA 的 Spring boot 2,我希望用 Spring Data JPA 的 Property Expressions 替换一些现有的 @Query 方法

但是,我正在努力锻炼多对多关系的表达式名称。我不太确定这是否可能,因为我看到的所有示例都是基于一对多关系的。

一个基本的例子可能是:

图书实体

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

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "title")
    private String title;

    @ManyToMany(mappedBy = "authors", cascade = CascadeType.REFRESH, fetch = FetchType.LAZY)
    private Set<Author> authors = new HashSet<>();

    // Getter and Setters
}

作者实体

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

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "forename")
    private String firstName;

    @Column(name = "surname")
    private String surname;

    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinTable(
        name = "author_books",
        joinColumns = @JoinColumn(name = "author_id", referencedColumnName = "id"),
        inverseJoinColumns = @JoinColumn(name = "book_id", referencedColumnName = "id"),
        uniqueConstraints = @UniqueConstraint(columnNames = {"author_id", "book_id"})
    )
    private Set<Book> books = new HashSet<>();

    // Getter and Setters
}

当前的 SQL 查询如下所示:

SELECT *
FROM book
LEFT JOIN author_books ON author_books.book_id = book.id
WHERE author_books.author_id = 1;

您将如何在 Book 存储库中编写等效的 Spring JPA 属性表达式(如果可能)?

我尝试了以下方法(没有运气):

List<Book> findByBooks_AuthorId(Long authorId);
List<Book> findByBooks_Author_Id(Long authorId);
List<Book> findByBooks_AuthorsId(Long authorId);
List<Book> findByBooks_Authors_Id(Long authorId);

一种解决方案是通过 id 获取作者对象,然后调用author.getBooks()。但是,我希望能够使用 spring 数据 PageRequestSpecification 类提供结果的过滤和分页。

任何帮助将不胜感激。

【问题讨论】:

    标签: spring spring-data spring-data-jpa jpa-2.0


    【解决方案1】:

    您是否尝试过使用查询注释.. https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.at-query

    @Query("SELECT * FROM book LEFT JOIN author_books ON author_books.book_id = book.id WHERE author_books.author_id = ?1")
    List<Book> findByBooks_AuthorId(Long authorId);
    

    【讨论】:

    • 你显然没有阅读我的问题,我说我正在寻找替换我现有的 @Query 注释。
    • 是的,我可能在阅读时错过了该声明..但不幸的是,我们没有直接的方法来获取它..唯一的替代方法是在存储库类中覆盖该方法..
    【解决方案2】:

    你可以试试这个:

    List<Book> findAllByAuthorId(Author author);
    

    【讨论】:

      【解决方案3】:

      您需要按作者 ID 查找书籍。所以你需要把它写成方法的名字:

      List<Book> findByAuthorsId(Long id);
      

      就是这样! 如果目标列的名称与实体字段的名称相同,也不需要使用 @Column(name=...) 注释。 Property expressions

      【讨论】:

        猜你喜欢
        • 2016-01-31
        • 2018-10-31
        • 2016-06-03
        • 1970-01-01
        • 1970-01-01
        • 2021-03-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多