tom*_*him 4 jpa projection dto openjpa querydsl
我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)
当我执行此查询时:
List<Folder> listFolders = query.from(folder)
.list(Projections.bean(Folder.class, folder.name, folder.file.fileName));
Run Code Online (Sandbox Code Playgroud)
我有一个错误,说Folder对象不包含fileName属性.
我理解QueryDSL正在做什么,因为它是一个简单的"平面"投影,但我想知道是否可以用查询找到的值填充我的folder.file对象的fileName属性.
注意:我知道我可以为我的Folder类定义构造函数并使用此方法:
query.list(ConstructorExpression.create(Folder.class, folder.name,
folder.file.fileName));
Run Code Online (Sandbox Code Playgroud)
但是如果可能的话我想避免这种情况,因为它迫使我在我的投影中为我想要的字段的N组合定义N构造函数.
您可以为此案例使用嵌套投影
List<Folder> listFolders = query.from(folder)
.list(Projections.bean(Folder.class, folder.name,
Projections.bean(File.class, folder.file.fileName).as("file")));
Run Code Online (Sandbox Code Playgroud)
这是构造函数和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;
}
Run Code Online (Sandbox Code Playgroud)
};
相关 http://www.querydsl.com/static/querydsl/3.6.0/apidocs/com/mysema/query/types/MappingProjection.html
| 归档时间: |
|
| 查看次数: |
3926 次 |
| 最近记录: |