Как получить 2 ВЫБОРА в 1 запросе с ВЕСЕННИМИ ДАННЫМИ

#java #spring #spring-boot #thymeleaf #jpql

#java #весна #весенняя загрузка #thymeleaf #jpql

Вопрос:

У меня есть 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);

  

Комментарии:

1. Для этого и нужен a GROUP BY .

Ответ №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);
  

всякий раз, когда вы используете функцию агрегирования, такую как count, все выбранные столбцы должны отображаться в группе по