我正在尝试从2个不同的表中接收信息,其中第三个处于中间。例如说我们有一个这样的数据库结构
db structure
如您所见,foo_and_bar表可以在foo和bar之间创建关系。现在我们可以说一个foo有很多bar,其中bar是带有静态数据的静态表(可以将其视为Player-> Items关系以及介于两者之间的Inventory表)。现在,在Java中,代码如下所示:
Foo实体
@实体
公共课Foo {
@Id
private Long ID;
private String fooData;
@OneToMany(mappedBy = "foo")
private List<FooAndBar> fooAndBars;
//Getters and setters left out for convenience
}
酒吧实体
@实体
公共课酒吧{
@Id
private Long ID;
private String BarData;
@OneToMany(mappedBy = "bar")
private List<FooAndBar> fooAndBars;
//Getters and setters left out for convenience
}
FooandBar实体
公共类FooAndBar {
@Id
private Long ID;
private String fooData;
@ManyToOne
@JoinColumn(name = "foo_id")
private Foo foo;
@ManyToOne
@JoinColumn(name = "bar_id")
private Bar bar;
//Getters and setters left out for convenience
}
现在说我们要找到一个Foo的所有Bar。为此,我们使用1个方法findByFooId创建一个FooAndBarRepository
@RestController
public class FooAndBarRepo extends JpaRepository<FooAndBarRepo, Long>{
List<Bar> findByFooId(Long id);
}
并编写一个简单的控制器来发出这样的GET请求
@Autowired
FooAndBarRepo fooAndBarRepo;
@RequestMapping("/get_bars")
public String getBars(@RequestParam(value = "fooId") Long fooId){
List<Bars> = fooAndBarRepo.findByFooId(fooId);
return "success!";
}
现在假设在我们的数据库中确实存在带有fooId的foo,如果我们使/ get_bars?fooId = {validIdHere},我们将得到一个ConverterNotFoundExeption像这样
No converter found capable of converting from type
[FooAndBar] to type [Bar]
错误在我们的rest控制器的这一行代码中抛出
List<Bar> findByFooId(Long id);
我究竟做错了什么?为什么无法将FooAndBar转换为Bar实例?
编辑:
我试图像这样将查询手动映射到我的findByFooId方法
@Query("select bar.id, bar.data from foo" +
"left join fooandbar fb on foo.id = fb.foo_id" +
"left join bar.id = fb.bar_id" +
"where foo_id = :fooId")
List<Bar> findByFooId(@Param("fooId") Long id);
查询工作,但现在我明白了
No converter found capable of converting from type
[Integer] to type [Bar]
因此,我收到数据,如何将其转换为Bar类型的对象?
最佳答案
如果要让方法返回List<Bar>
,则该方法应位于BarRepository
中。 FooAndBarRepository
用于返回FooAndBar
的方法。
并且,如果您希望JPQL查询返回Bar的实例,则应选择一个Bar,而不是bar.id
和bar.data
。
因此,在BarRepository
中使用该方法:
@Query("select distinct bar from FooAndBar fb join fb.bar bar where fb.foo.id = :fooId")
List<Bar> findByFooId(@Param("fooId") Long fooId);
关于java - 在Spring Boot Jpa中找不到转换器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51198066/