【问题标题】:How get 2 SELECT in 1 query with SPRING DATA如何使用 SPRING DATA 在 1 个查询中获得 2 个 SELECT
【发布时间】:2021-01-09 10:55:25
【问题描述】:

我有 3 个实体:

@Entity
@Table(name = "copy")
public class Copy {

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

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

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

    @ManyToOne
    @JoinColumn(name = "book_id")
    private Book book;

    @ManyToOne
    @JoinColumn(name = "library_id")
    private Library library;


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

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

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

    @Column(name = "pub_date")
    private Date pubDate;

    @Column(name = "page")
    private int page;

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

    //TODO Image à gérer
    @Column(name = "cover")
    private String cover;

    @ManyToOne
    @JoinColumn(name = "categorie_id")
    private Categorie categorie;

    @ManyToOne
    @JoinColumn(name = "author_id")
    private Author author;

    @OneToMany(mappedBy = "book")
    List<Copy> copyList = new ArrayList<>();


@Entity
@Table(name = "library")
public class Library implements Serializable {

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

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

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

    @Column(name = "phone_num")
    private String phoneNum;

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

    @OneToMany(mappedBy = "library")
    private List<Copy> copyList = new ArrayList<>();

我想根据图书的格式和图书馆恢复图书的副本数。但是,我无法弄清楚如何根据格式及其库检索副本列表和总数。我能怎么做。我写了这个请求,但我无法得到我想要的。

我的要求:

    @Query("SELECT DISTINCT  c, COUNT(c.format) FROM Copy c WHERE c.book.id = :id")
    List<Copy> getCopyById(@Param("id") Long id);

【问题讨论】:

  • 这就是GROUP BY 的用途。

标签: java spring spring-boot thymeleaf jpql


【解决方案1】:

首先你需要创建类来处理查询结果(副本,总数)

public class CopyWithTotal{
    Copy c;
    int total;
    CopyWithTotal(Copy c, int total){
        this.c = c;
        this.total = total;
    }
}

那么你应该在查询中构造这个类

@Query("SELECT new packgeTo.CopyWithTotal(DISTINCT  c, COUNT(c.format)) FROM Copy c WHERE c.book.id = :id group by c")
List<CopyWithTotal> getCopyById(@Param("id") Long id);

每当您使用聚合功能时,例如计数所有选定的列都应该出现在组中

【讨论】:

    猜你喜欢
    • 2014-07-31
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多