![](/img/trans.png)
[英][Spring boot ]Error in native query with join spring data jpa
[英]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.