在Spring Boot Jpa

时间:2018-07-05 18:48:58

标签: java spring hibernate spring-boot spring-data-jpa

我正在尝试从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类型的对象?

1 个答案:

答案 0 :(得分:1)

如果您希望方法返回List<Bar>,则该方法应位于BarRepository中。 FooAndBarRepository用于返回FooAndBar的方法。

如果您希望JPQL查询返回 Bar 的实例,则应选择一个Bar,而不是bar.idbar.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);