[英]@Formula to count object from a @OneToMany association in spring data jpa
In a java rest api, with spring boot, and spring-dta-jpa, db is postgresql I have a Book
entity that contains bookCopies
. 這些bookCopies
可能可用或不可用。 我正在嘗試用可用的副本數檢索這本書。 書籍可以按書名或作者姓名搜索。
我設法通過在我的書實體中添加一個@Transient
字段來獲取信息,並在getNbCopiesAvailable()
方法上使用@Transient
注釋,但我被要求使用@Formula
注釋來完成,我不知道如何去做吧。
我實際上遇到了一個錯誤:
org.postgresql.util.PSQLException: ERREUR: plus d'une ligne renvoyée par une sous-requête utilisée comme une expression
// which means that several lines are sent by the sub-query
這是我的實體:
@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<>();
@NotNull
@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinTable(name = "book_author",
joinColumns = @JoinColumn(name = "book_id"),
inverseJoinColumns = @JoinColumn(name = "author_id"))
private Set<Author> authors = new HashSet<>();
@Formula("(SELECT COUNT(bc.id) FROM book b left join book_copy bc on bc.book_id = b.id WHERE bc.available = 'true' GROUP BY b.id)")
private Long nbCopiesAvailable;
@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;
這是我的存儲庫,其中包含按標題和作者檢索書籍的查詢:
@Query("select b, a from Book b join b.authors a where b.title like %:title% and concat(a.firstName, ' ', a.lastName) like %:author%")
List<Book> findByTitleAndAuthor(@Param("title")String title,@Param("author") String author);
@Formula("(SELECT COUNT(bc.id) FROM book b left join book_copy bc on bc.book_id = b.id WHERE bc.available = 'true' GROUP BY b.id)")
很難寫語法錯誤,混合原生 sql 和 jpql 對我來說很奇怪。 但是,如果我嘗試在@Formula
中編寫 @Formula 它根本不起作用。
我檢查了這個最接近我的問題的主題( @Formula count on ManyToMany ),但它仍然不起作用。
您需要在 where 子句中引用該書:
@Formula("(SELECT COUNT(bc.id) FROM book b " +
"left join book_copy bc on bc.book_id = b.id " +
"WHERE bc.available = 'true' " +
"and b.id = id " + // This is the important condititon
"GROUP BY b.id)")
private Long nbCopiesAvailable;
否則,您的查詢將返回所有書籍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.