2015-12-12 63 views
2

我有數據庫架構這樣得到DTO: enter image description hereJPA正確的方法從數據庫

現在我想寫JPQL查詢或可能使用一些其他的技術來獲得他們的類型和信息從數據庫項目,如果項目是現在和誰借了(只有一個借款人列而不是全部借入清單)。我可以使用普通的查詢來獲得EAGER加載類型的項目,它可以工作,但問題在於借用。熱點獲取關於借款的信息,而不需要從數據庫中獲取所有借入的清單(或者如果我真的必須這樣做,如何以適當的方式指定借入者)

如果借款與borrow_date NOT NULL和return_date NULL 。我的項目類看起來是這樣的:

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; 


我使用新的POJO對象像ItemDto試圖與構造函數使用JPQL,它讓我獲得當前借款人,但這次的問題是與類型,類型對象的構造函數不能上場名單..這是我的查詢

"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。在構造函數表達式

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

它不允許集合值表達式(你的情況即i.types):

回答

0

JPA構造函數表達式定義如下。

所以,我認爲沒有標準的JPA方法來直接通過查詢來構建DTO,如果您的DTO包含集合並且您必須手動執行這部分轉換。

+0

通過手動說出你的意思是make for循環和每個BookDTO查詢類型到數據庫?或者你有更好的主意? – jgr

+0

@jgr。對於手動操作,我的意思是我會使用fetch連接來選擇與作者和借閱的項目提取。然後,我將通過從項目中獲取屬性將項目轉換爲DTO,並設置相關的DTO的屬性。這是一件容易的事,但你可能認爲它很乏味。如果是的話,你可以使用一些DTO映射器庫,例如許多[選擇](http://www.javacodegeeks.com/2013/10/java-object-to-object-mapper.html)爲你做這種轉換對於你 –

+0

但是,如果書是例如1000次借用,這個查詢將採取與書有關的1000個對象,即使我只是需要一個或零,這就是爲什麼我不想採取借用對象的整個列表..我知道我可以處理它在Java 8中以簡單的方式,但是在查詢數據庫時應該處理它。 – jgr

相關問題