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

模式如下所示,基本上是2个表,其中租借引用了电影

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'

最佳答案

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

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

如果您不想这样做,可以始终指定自己的 RowMapper ResultSetExtractor

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

class Movie {

    @Id Long id;
    String title;

    @Embedded
    Actor with;

    Rental rental;
}

class Actor {
    String name;
}

class Rental {
    Integer price;
}

您的选择需要返回以下列:
idid属性的
  • Movie
  • titletitle属性的
  • Movie
  • rental_priceprice属性的
  • Rental。注意前缀rental comes from the property name rental not from the class name Rental`。
  • rental_movie此列是Rental的人工ID,用于确定是否完全存在RentalMovie.rental是否为null
    该值无关,除了是否为null的事实。
    如果Rental具有id列,则不需要此列。
  • name类的name属性的
  • Actor

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

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

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

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

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

    09-11 05:27