2015-12-12 7 views
2

У меня есть схемы базы данных, как это: enter image description hereJPA правильный способ получить 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.

ответ

0

JPA определяет выражение конструктора следующим образом:

constructor_expression ::= 
     NEW constructor_name (constructor_item {, constructor_item}*) 
constructor_item ::= 
     single_valued_path_expression | 
     scalar_expression | 
     aggregate_expression | 
     identification_variable 

Это не позволяет выражение коллекторно-значение (т.е. i.types в вашем случае) в выражении конструктора.

Итак, я думаю, что нет стандартного метода JPA для построения DTO непосредственно через запрос, если ваш DTO содержит коллекцию, и вам нужно сделать эту часть преобразования вручную.

+0

Говоря вручную, вы имеете в виду make for loop и для каждого запроса BookDTO для типов в базе данных? Или у вас есть идея? – jgr

+0

@jgr. Для ручного, я имею в виду, я бы использовал fetch join, чтобы выбрать элемент fetch с его автором и заимствовать. Затем я преобразую элемент в DTO, получив свойство из элемента и установив соответствующие свойства DTO. Это непростая задача, но вы можете подумать, что это утомительно. Если да, вы можете прибегнуть к некоторой библиотеке карт DTO, например, к многим из [выбора] (http://www.javacodegeeks.com/2013/10/java-object-to-object-mapper.html), чтобы вы могли сделать это преобразование для вас –

+0

Но если книга была, например, 1000 раз заимствована, этот запрос займет около 1000 объектов, связанных с книгой, хотя мне просто нужен один или ноль, вот почему я не хочу брать весь список объектов Заимствования. Я знаю, что могу обрабатывать это в Java 8 простым способом, но imo нужно обрабатывать при запросе базы данных. – jgr

Смежные вопросы