如何使用和 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;
}
您的选择需要返回以下列:
id
的id
属性的Movie
title
的title
属性的Movie
rental_price
的price
属性的Rental
。注意前缀rental comes from the property name
rental not from the class name
Rental`。 rental_movie
此列是Rental
的人工ID,用于确定是否完全存在Rental
或Movie.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