Spring Data JDBC org.springframework.data.mapping.MappingException:无法从结果集中读取值rental_movie

问题描述 投票:2回答:2

如何通过Spring Data JDBC一对一关系选择查询过滤器?

Schema看起来像这样,基本上是2个表,其中Rental引用Movie

drop table if exists rental;
drop table if exists movie;

create table movie
(
    id          serial primary key,
    title       text,
    description text
);

create table rental
(
    movie    integer primary key references movie (id),
    duration text,
    price    integer
)

我的代码看起来像这样

@Query("select * from movie where title = :title ")
fun findByTitle(@Param("title") title: String): List<Movie>

但是出现异常org.springframework.data.mapping.MappingException:无法从结果集中读取值rental_movie!

GitHub上的示例项目。

P.S我对此很陌生,并按照video学习基础知识,请帮助我以适当的方式来做这件事

解决方案1

像这样使用@ Query,但效果仍然不佳,因为第二个表中可能有很多列

SELECT movie.*,
       rental.price    AS rental_price,
       rental.duration AS rental_duration,
       rental.movie    AS rental_movie
FROM movie
         LEFT OUTER JOIN rental ON rental.movie = movie.id
where movie.title = 'Matrix'
java spring kotlin one-to-one spring-data-jdbc
2个回答
0
投票
data class Movie(
        @Id
        val id: Long?,
        val title: String,
        val description: String,
        val rental: Rental
)

我不使用Kotlin,但我想如果要同时查询电影和租借,则必须使用@OneToOne批注。像(java):

public class Movie {
@OneToOne(mappedBy = "moive", cascade = CascadeType.ALL,
              fetch = FetchType.LAZY, optional = false)
private Rental rental;
}

并且您的Rental类不正确,需要movieId。

public class Rental {

   ...
   @OneToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "movie_id")
   private Movie movie;

}

您可以检查some code example


0
投票

您的解决方案#1当前是执行此操作的正确方法。

查询必须为聚合根的所有简单属性以及所有嵌入式或引用的实体返回列。

让我们假设以下类(类似于您可能拥有的类:

class Movie {

    @Id Long id;
    String title;

    @Embedded
    Actor with;

    Rental rental;
}

class Actor {
    String name;
}

class Rental {
    Integer price;
}

您的选择需要返回以下列:

  1. [id用于idMovie属性

  2. [title用于titleMovie属性

  3. rental_price对于priceRental属性。注意前缀rental comes from the property name rentalnot from the class nameRental`。

  4. rental_movie此列是Rental的人工ID,用于确定是否完全存在RentalMovie.rental是否为null。该值无关,除了是否为null的事实。如果Rental具有id列,则不需要此列。

  5. name对于类name的属性Actor

    注意:此处没有前缀。如果您需要前缀,例如因为一个类被多次嵌入,所以您必须将其放入@Embedded批注中。

    _注#1:此处没有人工ID。对于嵌入式类,onEmpty批注的@Embedded属性用于控制所有属性为空时,整个嵌入式类为null还是将所有属性设置为null的实例化嵌入式类。

使用Spring Data JDBC 1.x,缺少的列会导致异常。

从2.0版开始,缺少的列将被忽略,并且未设置该属性。

通过定义where子句,可以提供一种更简单的定义方法:https://jira.spring.io/browse/DATAJDBC-225

© www.soinside.com 2019 - 2024. All rights reserved.