我试图使用一个投影来从一个实体中提取数据,它有一些关系。然而。投影上的构造函数接受三个参数;一个集合,整数和另一个整数。如果没有这个集合作为参数,这一切都很好,但是一旦我添加了这个集合,我就开始得到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) {
}
}
下面是我正在使用的查询(不完全相同,因为这是我正在处理的问题的简化版本)....
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));
select . as col_0_0_
所以,我想我的主要问题是,我如何将一个集合作为一个对象包含在投影中?有可能吗,还是我只是做错了什么?
在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)));
给定这个查询: 问题是查询只在parentDevice不为空时返回设备。为什么?如何拿回任何价值?如果我从投影中取出qdevice.parentdevice,结果是好的。 QueryDsl版本为3.2.0
但是如果可能的话,我想避免这种情况,因为它迫使我定义n个构造函数,为我在投影中想要的n个字段组合定义n个构造函数。
这只有两种方式: 具有qdoc.id:存在,为空 不带qdoc.id:为空,存在 我已经检查过的内容:当我在Postgres客户机中运行Hibernate查询时,它总是带来字段。Bot在这两种情况下都存在。
我正在考虑使用DTO投影--我有两个具有一对多关系的实体(EntityOne的一个实例链接到EntityTwo的多个实例),我希望将结果作为一个新的DTO对象返回--我目前正在尝试的是: 其中MyDtoObject如下所示: 但是,这带来的MyDtoObjects比预期的要多得多,而且看起来每个对象都只包含一个entityTwo对象,而不是集合。 如何指示queryDSL创建具有多个entityT
我想优化一个queryDSL+Spring数据查询。目前我使用BooleanBuilder作为谓词,这很好,但是它连接了太多的表。我不需要表中的所有列,也不需要某些表。我相信使用投影会减少加入的表的数量。 那么,如何使QueryDSL连接表而不是从所有表中进行选择呢?我尝试优化查询是否正确?投影有意义吗?