簡體   English   中英

如何在 spring 數據 jpa 和 spring 引導中添加計數字段

[英]How to add a count field in spring data jpa and spring boot with join

我使用 Spring 引導和 spring 數據處理 rest 庫項目。 我有一個實體 Book ,其中包含 BookCopies 的集合。

@Entity
@Getter
@Setter
@NoArgsConstructor
public class Book {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String isbn;
    @NotNull
    private String title;

    @JsonIgnore
    @OneToMany(mappedBy = "book", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<BookCopy> copyList = new ArrayList<>();

...

@Entity
@Getter
@Setter
@Builder
@AllArgsConstructor
public class BookCopy {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String barcode;
    private String editor;
    private boolean available = true;

    @ManyToOne(fetch = FetchType.LAZY)
    private Book book;
...

我想執行一個請求,向我提供所有書籍和可用的副本數量。 在標准 sql 中執行它沒有問題:

select book.*, count(book_copy.id) as nb_copies from book
inner join book_copy on book.id = book_copy.book_id
where book.title like '%:title%' 
and book_copy.available = true
group by book.id

但我無法讓它在我的項目中工作。 本來以為用jpql也可以,但是當我嘗試加入實體bookCopy的時候,intellij並沒有做任何自動補全,這讓我懷疑是配置有問題。 如果我嘗試“在控制台中運行查詢”,它會告訴我“沒有找到跑步者”,即使我在 intellij 中設置了數據庫。 我也嘗試使用本機查詢來做到這一點,但它也不起作用。

我設法得到了結果,但我認為使用了錯誤的方法:

@Override
    public List<Book> findByTitle(String title) {
        List<Book> bookList = bookRepository.findByTitleLike("%"+title+"%");
        for(Book book:bookList){
            book.setCopyList(bookCopyRepository.findAllInBookWhereAvailable(book.getId(), true));
        }
        return bookList;
    }

這將開始查詢每本書以獲取副本列表。 所以我沒有想法,我無法獲得關於它的明確信息。 謝謝!

以下 JPQL 應返回與您的本機 SQL 查詢相同的數據集:

select b, count(c) from Book b
join b.copyList c
where b.title like :title and c.available
group by b

Java代碼:

        String title = ...;
        final List result = em.createQuery("select b, count(c) from Book b" +
                " join b.copyList c " +
                " where b.title like :title and c.available " +
                " group by b ")
                .setParameter("title", title)
                .getResultList();
        for (Object res : result) {
            Object[]  row = (Object[]) res;
            System.out.println("Book: " + row[0]);
            System.out.println("BookCopy CNT: " + row[1]);
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM