如何通过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'
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。
您的解决方案#1当前是执行此操作的正确方法。
查询必须为聚合根的所有简单属性以及所有嵌入式或引用的实体返回列。
让我们假设以下类(类似于您可能拥有的类:
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
rentalnot 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
的实例化嵌入式类。
使用Spring Data JDBC 1.x,缺少的列会导致异常。
从2.0版开始,缺少的列将被忽略,并且未设置该属性。
通过定义where子句,可以提供一种更简单的定义方法:https://jira.spring.io/browse/DATAJDBC-225