Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在QueryDsl中返回具有简单属性键的HashMap集合_Java_Jpa_Querydsl - Fatal编程技术网

Java 在QueryDsl中返回具有简单属性键的HashMap集合

Java 在QueryDsl中返回具有简单属性键的HashMap集合,java,jpa,querydsl,Java,Jpa,Querydsl,在Querydsl中,我想返回一个简单的Map集合。我想有一个简单的方法。我使用了QMap,但它将键作为完全限定属性而不是简单属性返回 因此,使用QMap集合时,不要让项目看起来像这样: { poolMaster.calculateValue: "Y" poolMaster.downloadStats: "Y" poolMaster.maxPlayerValue: 25 poolMaster.minPlayerValue: 5 poolMaster.pic

在Querydsl中,我想返回一个简单的
Map
集合。我想有一个简单的方法。我使用了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;
    };
}
public Collection findAll(){
从(poolMaster)返回此.from
.orderBy(poolMaster.year.desc())
.名单(
地图(
poolMaster.year,poolMaster.pickdimdate,poolMaster.downloadStats,
poolMaster.calculateValue、poolMaster.minPlayerValue、poolMaster.maxPlayerValue、,
poolMaster.poolSequences.size()文件
)
).stream()
.map(toHashMap())
.collect(toList());
}

公共静态函数我建议您使用
FactoryExpression
接口来实现转换。这应该更具性能,并且符合Querydsl中转换的方式


已经可以通过
QTuple
QMap
对结果进行映射式转换。这两个类的源代码应该可以为您提供一些关于如何创建映射转换的指导。

在我的例子中,我想获得一个
映射,我成功地实现了以下几点:

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