Java 在QueryDsl中返回具有简单属性键的HashMap集合
在Querydsl中,我想返回一个简单的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
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"
}
}