具有 @ManyToOne 关系的 QueryDSL 投影

2024-02-07

我将 OpenJPA 与 QueryDSL 一起使用,我尝试通过使用 QueryDSL 的 bean 投影功能来避免操作 Tuple 对象。例如,我有这两个实体,具有 @ManyToOne 关系。

@Entity
public class Folder {
    private Long id;
    private String name;
    private String path;
    @ManyToOne
    @JoinColumn(name = "FK_FILE_ID")
    private File file;
}

@Entity
public class File {
    private Long id;
    private String fileName;
}

当我执行此查询时:

List<Folder> listFolders = query.from(folder)
.list(Projections.bean(Folder.class, folder.name, folder.file.fileName));

我收到错误消息,指出文件夹对象不包含 fileName 属性。

我理解 QueryDSL 在做什么,因为它是一个简单的“平面”投影,但我想知道是否可以用查询找到的值填充我的folder.file对象的fileName属性。

注意:我知道我可以为我的文件夹类定义一个构造函数并使用此方法:

query.list(ConstructorExpression.create(Folder.class, folder.name,
folder.file.fileName));

但如果可能的话,我想避免这种情况,因为它迫使我为我在投影中想要的字段的 N 组合定义 N 构造函数。


对于这种情况,您可以使用嵌套投影

List<Folder> listFolders = query.from(folder)
    .list(Projections.bean(Folder.class, folder.name, 
          Projections.bean(File.class, folder.file.fileName).as("file")));

这是构造函数和 bean 投影的更明确的替代方案,也适用于这种情况

MappingProjection<Folder> mapping = new MappingProjection<Folder>(Folder.class, folder.name, folder.file.fileName) {
 @Override
 protected Folder map(Tuple row) {
     Folder f = new Folder();         
     f.setName(row.get(folder.name));
     File file = new File();
     file.setFileName(row.get(folder.file.fileName));
     f.setFile(file);
     return f;
 }            

};

Related http://www.querydsl.com/static/querydsl/3.6.0/apidocs/com/mysema/query/types/MappingProjection.html http://www.querydsl.com/static/querydsl/3.6.0/apidocs/com/mysema/query/types/MappingProjection.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有 @ManyToOne 关系的 QueryDSL 投影 的相关文章

随机推荐