gpt4 book ai didi

QueryDSL 投影中的集合

转载 作者:行者123 更新时间:2023-12-05 01:08:32 25 4
gpt4 key购买 nike

我正在尝试使用投影从实体及其具有的某些关系中提取数据。然而。投影的构造函数接受三个参数;一个集合,整数​​和另一个整数。如果我没有将集合作为参数,这一切都很好,但是一旦我添加了集合,我就会开始收到 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));

只要我的投影类中没有 rendition.resources,这个查询就可以正常工作。如果我尝试将其添加进去,我会开始收到格式错误的 SQL 错误(它更改了输出 sql 以使其以此开头。
select . as col_0_0_

所以,我想我的主要问题是如何将 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)));

关于QueryDSL 投影中的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17116711/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com