2015-12-12 62 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

相关问题