6

我正在尝试使用投影从实体中提取数据以及它具有的某些关系。然而。投影上的构造函数接受三个参数;一个集合,整数​​和另一个整数。如果我没有将集合作为参数,这一切都可以正常工作,但是一旦添加集合,我就会开始收到 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 作为对象?有可能,还是我只是在这里做错了什么?

4

1 回答 1

8

在 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)));
于 2013-06-17T19:58:22.773 回答