簡體   English   中英

帶有計數字段的JPQL ManyToMany查詢

[英]JPQL ManyToMany query with count field

在具有Spring安全性的Spring Boot應用程序中,用戶和電影這兩個實體之間存在多對多關系。

我想創建一個REST API,以查找所有電影,並包括一個新字段,該字段顯示登錄的用戶是否看過電影。

我找不到簡單的方法,只找到了在查詢中創建新的DTO對象的解決方案。 接下來顯示我的代碼。

實體如下:

電影:

@Entity
@Table(name = "movies")
public class Movies implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
@SequenceGenerator(name = "sequenceGenerator")
private Long id;

@NotNull
@Size(max = 100)
@Column(name = "name", length = 100, nullable = false)
private String name;

@Column(name = "jhi_year")
private Long year;

@Size(max = 100)
@Column(name = "category", length = 100)
private String category;

@ManyToMany(mappedBy = "movies")
@JsonIgnore
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
private Set<User> users = new HashSet<>();

用戶:

@Entity
@Table(name = "user")
public class User implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
@SequenceGenerator(name = "sequenceGenerator")
private Long id;

@Size(max = 50)
@Column(name = "login", length = 50)
private String login;

@Size(max = 250)
@Column(name = "bio", length = 250)
private String bio;

@ManyToMany
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@JoinTable(name = "user_movies",
           joinColumns = @JoinColumn(name="user_id", referencedColumnName="id"),
           inverseJoinColumns = @JoinColumn(name="movies_id", referencedColumnName="id"))

我所做的是一個帶有JPQL @query的@Repository類,如下所示:

@Query("select new com.test.service.dto.MoviesDTO(movies.id, movies.name, movies.year, movies.category, " +
" count(users.id)) from Movies movies left join movies.users users on users.login = ?#{principal.username} group by movies.id ")
Page<MoviesDTO> findAll(Pageable pageable);

這可以正常工作,但是有沒有更簡單的方法可以做到這一點? 最好找到一種方法來執行此操作,從而在實體類中添加一個新對象,而避免在查詢中創建一個新的DTO對象。

我知道這幾乎與我自己前一段時間發布的這個問題相同,這對我來說仍然是個謎。

非常感謝!

感謝jasarez的回答。 我將DOT更改為投影,它的工作原理就像一個吊飾!

倉庫:

@Query("select movies.id as id, movies.name as name, movies.year as year, movies.category as category, count(users.id) as moviesCount " +
    "from Movies movies left join movies.users users on users.login = ?#{principal.username} group by movies.id")
     Page<MovieWithUserData> findAllWithUserData(Pageable pageable);

和預測:

public interface MovieWithUserData {

    Long getId();

    String getName();

    String getCategory();

    Integer getYear();

    Long getMoviesCount();

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM