【问题标题】:JPQL ManyToMany query with count field带有计数字段的 JPQL ManyToMany 查询
【发布时间】:2018-11-25 13:13:12
【问题描述】:

我在具有 Spring Security 的 Spring Boot 应用程序中的两个实体 User 和 Movies 之间存在多对多关系。

我想创建一个 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 对象。

我知道这与我前一段时间发布的this one几乎相同,这对我来说仍然是一个谜。

非常感谢!

【问题讨论】:

标签: java spring-boot jpa spring-security hibernate-mapping


【解决方案1】:

感谢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();

}

【讨论】:

    猜你喜欢
    • 2017-03-10
    • 2015-09-11
    • 2013-10-23
    • 1970-01-01
    • 2013-04-04
    • 2021-12-04
    • 2011-04-26
    • 1970-01-01
    • 2020-02-18
    相关资源
    最近更新 更多