java - 在 Spring boot Jpa 中找不到转换器

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

我正在尝试从 2 个不同的表中接收信息,中间有第三个表。比如说我们有这样的数据库结构 db structure

如您所见,foo_and_bar 表用于创建 foo 和 bar 之间的关系。现在我们可以说一个 foo 有很多 bars,其中 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

}

酒吧实体 @实体 公共(public)类栏 {

@Id
private Long ID;

private String BarData;

@OneToMany(mappedBy = "bar")
private List<FooAndBar> fooAndBars;

//Getters and setters left out for convenience
}

FooandBar 实体 公共(public)类 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 的所有 Bars。为此,我们使用 1 个方法 findByFooId 创建一个 FooAndBarRepository

@RestController
public class FooAndBarRepo extends JpaRepository<FooAndBarRepo, Long>{
     List<Bar> findByFooId(Long id); 
}

然后编写一个简单的 Controller 来发出这样的 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 controller 中的这行代码处抛出的

List<Bar> findByFooId(Long id); 

我做错了什么?为什么 spring 不能将 FooAndBar 转换为 Bar 实例?

编辑: 我尝试像这样手动将 Query 映射到我的 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/

相关文章:

java - 测量 double 与 BigDecimal

java - 使用 Eclipse 将 JavaFX 项目导出到可运行的

spring - 系统属性 -Dspring.profiles.active 在 gradle 构建的 spring boot 测试配置中不可用

java - Spring Boot 应用程序类可以扩展什么?

Java/Hibernate 在实体上使用接口(interface)

java - 如何将参数添加到 SOAP URL 并在服务端检索它们

java - 在 JDO 查询中忽略大小写

java - 启用 Spring AOP 或 AspectJ

java - 服务层在 spring 应用程序中绑定(bind)到 DB 技术

java - 使用 tynamo-security 模块在 Tapestry Web 应用程序中实现身份验证功能的问题