繁体   English   中英

@Formula 从 spring 数据 jpa 中的 @OneToMany 关联中计算 object

[英]@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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM