首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >带有@ManyToOne关系的QueryDSL投影

带有@ManyToOne关系的QueryDSL投影
EN

Stack Overflow用户
提问于 2014-12-30 20:40:31
回答 1查看 6.2K关注 0票数 7

我正在使用OpenJPA和QueryDSL,我试图通过使用QueryDSL的bean投影特性来避免操作元组对象。例如,我有这两个实体,具有@ManyToOne关系。

代码语言:javascript
代码运行次数:0
运行
复制
@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;
}

当我执行这个查询时:

代码语言:javascript
代码运行次数:0
运行
复制
List<Folder> listFolders = query.from(folder)
.list(Projections.bean(Folder.class, folder.name, folder.file.fileName));

我有一个错误,说文件夹对象不包含fileName属性。

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

注意:我知道我可以为我的Folder类定义一个构造函数,并使用这个方法:

代码语言:javascript
代码运行次数:0
运行
复制
query.list(ConstructorExpression.create(Folder.class, folder.name,
folder.file.fileName));

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

EN

回答 1

Stack Overflow用户

发布于 2015-01-04 19:20:56

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

代码语言:javascript
代码运行次数:0
运行
复制
List<Folder> listFolders = query.from(folder)
    .list(Projections.bean(Folder.class, folder.name, 
          Projections.bean(File.class, folder.file.fileName).as("file")));

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

代码语言:javascript
代码运行次数:0
运行
复制
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;
 }            

};

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

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27705687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档