在QueryDsl中使用简单的属性键返回HashMap集合

时间:2015-03-28 20:10:33

标签: java jpa querydsl

在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;
    };
}

2 个答案:

答案 0 :(得分:0)

我建议您使用FactoryExpression界面来实现转换。这应该更高效,并且还符合Querydsl中的转换方式。

可以通过QTupleQMap获取与结果转化相似的地图。这两个类的来源应该为您提供如何创建地图转换的方向。

答案 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"
  }
}