JPA从数据库中获取DTO的正确方法

时间:2015-12-12 10:23:23

标签: java jpa spring-data-jpa jpql

我有这样的数据库架构:

enter image description here

现在我想编写JPQL查询或者使用其他一些技术来获取数据库中的项目及其类型和信息,如果项目现在和谁借用(只有一个借用者列而不是整个借用列表)。我可以使用正常的查询来获取带有EAGER加载类型的项目,它可以工作,但问题是借用。如何获取有关借用的信息而不从数据库中获取全部借款清单(或者如果我真的必须如何以适当的方式指定借款人)?

如果项目借用了borrow_date 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和构造函数使用像ItemDto这样的新POJO对象,它让我获得当前借用者但这次问题是类型,构造函数不能获取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。

1 个答案:

答案 0 :(得分: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)。

所以,我认为如果您的DTO包含一个集合并且您必须手动执行这部分转换,则没有标准的JPA方法直接通过查询构建DTO。