在Querydsl中,我想返回一个简单的Map<String, Object>
集合。我想有一种简单的方法可以做到这一点。我使用过QMap,但它将键作为完全限定属性而不是简单属性返回。
所以使用QMap集合代替看起来像这样的项目:
{
poolMaster.calculateValue: "Y"
poolMaster.downloadStats: "Y"
poolMaster.maxPlayerValue: 25
poolMaster.minPlayerValue: 5
poolMaster.pickDeadline: 1430366400000
size(poolMaster.poolSequences): 1
poolMaster.year: 2015
}
我希望得到这样的项目:
{
calculateValue: "Y"
downloadStats: "Y"
maxPlayerValue: 25
minPlayerValue: 5
pickDeadline: 1430366400000
poolSequencesCount: 1
year: 2015
}
到目前为止,这是我精心设计的解决方案,但我希望Querydsl已经内置了一些东西。
public Collection<Map<String, Object>> findAll() {
return this.from(poolMaster)
.orderBy(poolMaster.year.desc())
.list(
map(
poolMaster.year, poolMaster.pickDeadline, poolMaster.downloadStats,
poolMaster.calculateValue, poolMaster.minPlayerValue, poolMaster.maxPlayerValue,
poolMaster.poolSequences.size()
)
).stream()
.map(toHashMap())
.collect(toList());
}
public static Function<Map<Expression<?>, ?>, Map<String, Object>> toHashMap() {
return expressionMap -> {
Map<String, Object> map = new HashMap<>();
for (Expression<?> key : expressionMap.keySet()) {
Path path = null;
String suffix = "";
if(key instanceof NumberOperation) {
NumberOperation op = (NumberOperation) key;
if(op.getOperator().getId().equals(Ops.COL_SIZE.getId())) {
suffix = "Count";
}
path = (Path) op.getArg(0);
}
if(key instanceof Path) {
path = (Path) key;
}
if(path != null) {
map.put(path.getMetadata().getName() + suffix, expressionMap.get(key));
}
}
return map;
};
}
答案 0 :(得分:0)
我建议您使用FactoryExpression
界面来实现转换。这应该更高效,并且还符合Querydsl中的转换方式。
可以通过QTuple
和QMap
获取与结果转化相似的地图。这两个类的来源应该为您提供如何创建地图转换的方向。
答案 1 :(得分:0)
以我为例,我想获得一个Map <String, Map <String, String>>
,并成功获得了以下成就:
return new JPAQuery<Map<String, Map>>(getEm())
.from(qclasss)
.where(conditions)
.transform(groupBy(qclasss.propertyKey).as(map(qclasss.property1, qclasss.property2)));
此格式的返回:
{
"key1": {
"property1": "property1Value",
"property2": "property2Value"
}
}