当前位置: 首页 > 知识库问答 >
问题:

Spring数据:JPA存储库返回映射而不是列表?

皇甫琛
2023-03-14

我有这样的查询,我想从中提取电影标题及其评级

   @Query(value ="SELECT m.title, avg(r.rating) " +
        "FROM movies m " +
        "INNER JOIN " +
        "ratings r " +
        "ON m.movieid = r.movieid " +
        "WHERE m.genres LIKE %:genre% " +
        "GROUP BY m.title " +
        "ORDER BY avg(r.rating) DESC " +
        "LIMIT 10",
        nativeQuery = true)
 List<Movies> topTenMoviesByGenreLikeIgnoreCase(@Param("genre") String genre);

但此列表显然不能存储具有2个值的结果集

在了解它之后,我发现例如这个链接Spring Data: JPA repository findAll()返回*Map而不是List?但我似乎不清楚它们的实现。

我不明白他们从哪里得到第一个链接中的长值

default Map<Long, TransactionModel> findByClientIdMap(Long id) {
    return findByClientId(id).stream().collect(Collectors.toMap(TransactionModel::getId, v -> v));
}

我如何创建我的地图?

default Map<Movies, Float> topTenMoviesByGenreLikeIgnoreCaseMap(@Param("genre") String genre) {
    return topTenMoviesByGenreLikeIgnoreCase(genre).stream().collect(Collectors.toMap());
}

电影类:

@Entity
public class Movies {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer movieid;

private String title;
private String genres;

@OneToMany(mappedBy = "movieid")
private Set<Ratings> rates = new HashSet<>();

public Movies() {
}

public Movies(String title, String genres) {
    this.title = title;
    this.genres = genres;
}

/*Getters and Setters for variables*/

public Set<Ratings> getRates() {
    return rates;
}

public void setRates(Set<Ratings> rates) {
    this.rates = rates;
}
}

评级等级:

@Entity
public class Ratings {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer rateid;

@ManyToOne
@JoinColumn(name = "movieid")
private Movies movieid;

@ManyToOne
@JoinColumn(name = "userid")
private Usrs userid;

private float rating;
private Integer timestamp;

public Ratings() {
}

public Ratings(Movies movieid, Usrs userid, float rating, Integer timestamp)
{
    this.movieid = movieid;
    this.userid = userid;
    this.rating = rating;
    this.timestamp = timestamp;
}
/*Getters and Setters for variables*/
}

共有2个答案

呼延聪
2023-03-14

试试这个:

@Query(value ="SELECT m.title as title, r.avg(rating) as rates " +
    "FROM movies m " +
    "INNER JOIN " +
    "ratings r " +
    "ON m.movieid = r.movieid " +
    "WHERE m.genre = LIKE %:genre% " +
    "GROUP BY r.avg(rating) " +
    "ORDER BY r.avg(rating) DESC " +
    "LIMIT 10",
    nativeQuery = true)

List<Movies> topTenMoviesByGenreLikeIgnoreCase(@Param("genre") String genre);    



default Map<Movies, Set<Ratings>> topTenMoviesByGenreLikeIgnoreCaseMap(@Param("genre") String genre) {
    return topTenMoviesByGenreLikeIgnoreCase(genre).stream().collect(
                                                            Collectors.toMap(
                                                            tuple -> (tuple.getTitle(),
                                                            tuple -> (tuple.getRates())
                                                         ));
}
澹台镜
2023-03-14

您可以通过这种方式使用<code>对象[]

@Query(value ="SELECT m.title, avg(r.rating) " +
        "FROM movies m " +
        "INNER JOIN " +
        "ratings r " +
        "ON m.movieid = r.movieid " +
        "WHERE m.genres LIKE %:genre% " +
        "GROUP BY m.title " +
        "ORDER BY avg(r.rating) DESC " +
        "LIMIT 10",
        nativeQuery = true)
 List<Object[]> topTenMoviesByGenreLikeIgnoreCase(@Param("genre") String genre);

所以,然后

default Map<String, Float> topTenMoviesByGenreLikeIgnoreCaseMap(@Param("genre") String genre) {
    return topTenMoviesByGenreLikeIgnoreCase(genre)
            .stream()
            .collect(Collectors.toMap((arr->arr[0].toString()), (arr->Float.valueOf(arr[1].toString()))));
}

如您所见,topTenMoviesByGenreLikeIgnoreCaseMap返回地图,其中电影标题是关键。要使电影实体成为键,您应该使用JPQL查询而不是本机查询。

 类似资料:
  • 应用:Spring防尘套 我试图用SqlResultSetMapping和NamedNativeQuery将非实体类映射到JPA存储库。 运行应用程序时出现以下错误: 通过字段'cityAddressRepository'表示不满足的依赖关系;嵌套异常是org.springframework.beans.factory.BeanCreationException:创建名称为'cityAddress

  • 我在后端代码中使用了Spring数据jpa。我已经包含了实体,dto接口,服务和jpa存储库代码。 现在的问题是,当我在< code>TopicService中调用< code>getAllTopics()时。它返回< code>Topic对象的列表,而不是< code>TopicDto。< code>Topic对象包含一个< code >示例列表,我没有将它包含在< code>TopicDto中

  • 我试图获取一个列表从数据库和findAll()返回空列表。我有多个jpa存储库,但只有一个不工作。这是代码: 这就是实体: 当我调用product类别epository.findAll()时,它返回空列表,因此我在数据库中有许多条目。谢谢你的帮助!

  • 我有一个Spring Data JPA存储库接口,看起来像这样: 除了返回类型为HashMap的集合之外,是否有其他解决方法可以实现相同的效果

  • 它是否将其存储在缓存中?我有一个应用程序,但应用程序中没有任何地方。属性是提到的db详细信息。我可以通过邮递员存储数据和查询它。

  • 我在使用spring-data-neo4j的项目中遇到了一些问题。我有一个节点实体类: 并使用以下方法为其创建存储库: 然后测试,就像这样: > 创建id为123456的广告节点,包含关键字1和关键字2-ok 创建id为654321且包含关键字1的广告节点-确定 获取广告ID 654321-工作正常,生成的查询是: 开始=节点:(={0})返回params{0=654321} 使用findSimi