簡體   English   中英

JPA從數據庫獲取DTO的正確方法

[英]JPA proper way to get DTO from database

我有這樣的數據庫架構:

在此處輸入圖片說明

現在,我想編寫JPQL查詢或使用其他技術從數據庫中獲取項目的類型和信息(如果項目現在以及由誰借(僅一個借方列而不是整個借項列表))。 我可以使用普通查詢來獲取具有EAGER加載的類型的項目,它可以工作,但問題出在借書上。 如何在不從數據庫中獲取全部借款清單的情況下獲取有關借款的信息(或者如果我真的必須這樣做,則如何以適當的方式指定借款人)?

如果項目借入的項目帶有借貸日期NOT 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),它讓我獲得了當前借用者,但是這次的問題是類型,構造函數無法獲取Type對象的列表。 這是我的查詢

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。

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

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

它不允許在構造函數表達式中使用集合值表達式(即i.types )。

因此,我認為,如果您的DTO包含集合並且您必須手動執行此部分轉換,則沒有標准的JPA方法可以通過查詢直接構造DTO。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM