dav*_*ija 4 collections querydsl
我正在尝试使用投影从实体中获取数据与它具有的某种关系.然而.投影上的构造函数有三个参数; 集合,整数和另一个整数.如果我没有作为参数的集合,这一切都正常,但是一旦我添加集合,我就开始得到SQL语法查询错误.
这是我正在使用的一个例子......
@Entity
public class Resource {
private Long id;
private String name;
private String path;
@ManyToOne
@JoinColumn(name = "FK_RENDITION_ID")
private Rendition rendition;
}
@Entity
public class Document {
private Long id;
private Integer pageCount;
private String code;
}
@Entity
public class Rendition {
Long id;
@ManyToOne
@JoinColumn(name="FK_DOCUMENT_ID")
Document doc;
@OneToMany(mappedBy="rendition")
Set<Resource> resources;
}
public class Projection {
@QueryProjection
public Projection(Set<Resource> resources, Integer pageCount, String code) {
}
}
Run Code Online (Sandbox Code Playgroud)
这是我正在使用的查询(不完全相同,这是我正在处理的简化版本)....
QRendition rendition = QRendition.rendition;
Projection projection = from(rendition)
.where(rendition.document().id.eq(documentId)
.and(rendition.resources.isNotEmpty())
.limit(1)
.singleResult(
new QProjection(rendition.resources,
rendition.document().pageCount,
rendition.document().code));
Run Code Online (Sandbox Code Playgroud)
只要我的投影类中没有rendition.resources,此查询就可以正常工作.如果我尝试添加它,我开始得到格式错误的SQL错误(它会更改输出sql,以便它以此开头.
select . as col_0_0_
Run Code Online (Sandbox Code Playgroud)
所以,我想我的主要问题是如何在投影中包含Set作为对象?是可能的,还是我在这里做错了什么?
在JPA中使用投影中的集合是不可靠的.加入集合并汇总结果更安全.
Querydsl也可用于结果聚合http://www.querydsl.com/static/querydsl/3.2.0/reference/html/ch03s02.html#d0e1799
在你的情况下这样的事情
QRendition rendition = QRendition.rendition;
Projection projection = from(rendition)
.innerJoin(rendition.document, document)
.innerJoin(rendition.resources, resource)
.where(document.id.eq(documentId))
.limit(1)
.transform(
groupBy(document.id).as(
new QProjection(set(resources),
document.pageCount,
document.code)));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5846 次 |
| 最近记录: |