Конвертер не найден в Spring загрузки Jpa - PullRequest
0 голосов
/ 05 июля 2018

Я пытаюсь получить информацию из 2 разных таблиц с третьей между ними. Скажем, например, у нас есть структура базы данных, как это дБ структура

Как видите, таблица foo_and_bar работает для создания отношения между foo и bar. Теперь мы можем сказать, что у одного foo есть много баров, где bar - это статическая таблица со статическими данными (представьте, что это отношение Player -> Items и таблица Inventory между ними). Теперь в Java код выглядит так: Фу сущность @Сущность открытый класс 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. Для этого мы создаем FooAndBarRepository с 1 методом findByFooId

@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!";
}

Теперь, предположив, что в нашей базе данных действительно есть foo с fooId, если мы сделаем / get_bars? FooId = {validIdHere}, мы получим ConverterNotFoundExeption, как это

No converter found capable of converting from type 
[FooAndBar] to type [Bar]

Ошибка в этой строке кода в нашем контроллере отдыха

List<Bar> findByFooId(Long id); 

Что я делаю не так? Почему весна не может конвертировать FooAndBar в экземпляр Bar?

EDIT: Я попытался сопоставить 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?

1 Ответ

0 голосов
/ 05 июля 2018

Если вам нужен метод, возвращающий 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...