#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, все выбранные столбцы должны отображаться в группе по