我有这样的数据库架构:
现在我想编写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。
答案 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。