Hibernate: Как отобразить данные из нескольких таблиц - PullRequest
1 голос
/ 22 апреля 2020

Я новичок в весенних / спящих технологиях, я пытался найти информацию об этом, но не смог, поэтому, если вы можете помочь, я буду так благодарен!

Мне нужно отобразить JSON Ответ в браузере нескольких таблиц, одна таблица имеет первичный ключ для другой.

Мои сущности:

@Entity
@Table
@ToString
public class Book {
    @Id
    @GeneratedValue(strategy = AUTO)
    @JsonView(Views.IdName.class)
    private Long book_id;

    @JsonView(Views.IdName.class)
    private String name;

    @Column(length = 1000000)
    private String text;


    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="author_id")
    @JsonView(Views.IdName.class)
    private Author author;

    // ....get/set methods

Еще одна:

@Entity
@Table
@ToString
public class Page {
    @Id
    @GeneratedValue(strategy = AUTO)
    private Long id;

    @Column(length = 1000000)
    private String text;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "book_id")
    private Book book;

    // ...get/set methods

Мои контроллеры :

@RestController
@RequestMapping("books")
public class BookController {
    private final BookRepo bookRepo;

    @Autowired
    public BookController(BookRepo bookRepo) {
        this.bookRepo = bookRepo;
    }

    @GetMapping
    @JsonView(Views.IdName.class)
    public List<Book> getAll() {
        return bookRepo.findAll();
    }

    @GetMapping("{id}")
    public Book getOne(@PathVariable("id") Book book) {
        return book;
    }
}

Еще один:

@RestController
@RequestMapping("authors")
public class AuthorController {
    private final AuthorRepo authorRepo;

    @Autowired
    public AuthorController(AuthorRepo authorRepo) {
        this.authorRepo = authorRepo;
    }

    @GetMapping
    public List<Author> getAll() {
        return authorRepo.findAll();
    }

    @GetMapping("{id}")
    public Optional<Author> getOne(@PathVariable("id") Long id) {
        return authorRepo.findById(id);
    }
}

А также репо для взаимодействия с БД (они похожи):

public interface AuthorRepo extends JpaRepository<Author, Long> {
}

Итак, когда я делаю запрос на получение всех книг, я беру следующие JSON:

введите описание изображения здесь

Бит Я хочу другой результат, что-то вроде:

[
    {
        "book_id" : 1,
        "name": "name 1 book",
        "author" : 
                  {
                      "author_id" : 1,
                      "name": "some_name"
                  } 
    }
]

Кроме того, когда я попытаюсь сделать запрос для /hors / 1, я получу следующий ответ (что-то вроде рекурсии):

введите описание изображения здесь

Так какая помощь, как я могу справиться с этим? Спасибо!

1 Ответ

0 голосов
/ 22 апреля 2020

Вы можете использовать @NoRepositoryBean

как в этом примере:

@NoRepositoryBean
public interface MappedTypeRepository<T extends AbstractMappedType>
  extends Repository<T, Long> {

  @Query("select new com.example.YourObjectWithConstructor(e.attribute, sub.sub_attribute) from entity e inner join e.subtable sub where e.attribute = ?1")
  List<YourObjectWithConstructor> findAllByAttribute(String attribute);
}

Мой пример может быть не на 100% правильным, я не проверял синтаксис. Не стесняйтесь исследовать это Проверьте это также: JPQL Создать новый объект в операторе выбора - избежать или охватить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...