У меня есть схемы базы данных, как это: JPA правильный способ получить DTO из БД
Теперь я хочу написать JPQL запрос или, возможно, использовать другие технологии для получения элементов из базы данных с их типами и информации, если элемент заимствован прямо сейчас и кем (всего одна колонка заемщика вместо всего списка). Я мог бы использовать только обычный запрос, чтобы получить элементы с их типами с загрузкой EAGER, и он может работать, но проблема связана с записями. Горячий, чтобы получить информацию о заимствовании, не беря весь список заимствований из базы данных (или, если мне действительно нужно это делать, чтобы правильно назначить заемщика)
Товар заимствован, если он занят с заем_датом NOT NULL и return_date NULL , Мой класс Item выглядит следующим образом:
public abstract class Item extends BaseEntity {
private String isbn;
private String title;
private Integer pageNumber;
@DateTimeFormat(iso = ISO.DATE)
private LocalDate releaseDate;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "items_types", joinColumns = {
@JoinColumn(name = "item_id", referencedColumnName = "id") }, inverseJoinColumns = {
@JoinColumn(name = "type_id", referencedColumnName = "id") })
private Set<Type> types;
@OneToMany(mappedBy = "item", cascade = { CascadeType.REMOVE })
private List<Borrow> borrows;
Я попытался использовать JPQL с конструктором, использующим новым объектом POJO как ItemDto, это позволяет мне получить текущий заемщик, но на этот раз проблема с типами, конструктор косяк список дубля Типа объекта .. Это мой запрос
"select new com.test.library.dto.ItemDto(i.id, i.isbn,i.title, i.pageNumber, i.releaseDate,
a.firstName, bb.lastName, i.types) from Item i LEFT JOIN i.borrows b ON (b.returnDate
IS NULL) LEFT JOIN i.author a LEFT JOIN b.borrower bb "
i.types - не работает, когда я удалить его, этот конструктор работает отлично, но мне нужно типы элементов, чтобы отобразить его на мой взгляд, так что правильный путь для достижения это?
Я использую spring-data-jpa + JPA 2.1.
Говоря вручную, вы имеете в виду make for loop и для каждого запроса BookDTO для типов в базе данных? Или у вас есть идея? – jgr
@jgr. Для ручного, я имею в виду, я бы использовал fetch join, чтобы выбрать элемент fetch с его автором и заимствовать. Затем я преобразую элемент в DTO, получив свойство из элемента и установив соответствующие свойства DTO. Это непростая задача, но вы можете подумать, что это утомительно. Если да, вы можете прибегнуть к некоторой библиотеке карт DTO, например, к многим из [выбора] (http://www.javacodegeeks.com/2013/10/java-object-to-object-mapper.html), чтобы вы могли сделать это преобразование для вас –
Но если книга была, например, 1000 раз заимствована, этот запрос займет около 1000 объектов, связанных с книгой, хотя мне просто нужен один или ноль, вот почему я не хочу брать весь список объектов Заимствования. Я знаю, что могу обрабатывать это в Java 8 простым способом, но imo нужно обрабатывать при запросе базы данных. – jgr