Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.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 Spring Crudepository return group by result作为映射_Java_Sql_Spring_Jpa_Spring Data Jpa - Fatal编程技术网

Java Spring Crudepository return group by result作为映射

Java Spring Crudepository return group by result作为映射,java,sql,spring,jpa,spring-data-jpa,Java,Sql,Spring,Jpa,Spring Data Jpa,我使用crudepository执行本机查询,其中使用sum和groupby。我希望查询以(哈希)映射的形式返回结果。我的查询如下所示: @Query(value = "SELECT l.currency, sum(l.price) as total_revenue from line l " + "where ol.id0 = :id0 and l.date_time between :dateStart and :dateEnd and " + "(cast(:id1 as

我使用crudepository执行本机查询,其中使用sum和groupby。我希望查询以(哈希)映射的形式返回结果。我的查询如下所示:

 @Query(value = "SELECT l.currency, sum(l.price) as total_revenue from line l " + "where ol.id0 = :id0 and l.date_time between :dateStart and :dateEnd and " +
        "(cast(:id1 as text) is null or cast(l.id1 as text) = cast(:id1 as text)) and " +
        "(cast(:id2 as text) is null or cast(l.id2 as text) = cast(:id2 as text))" +
        "group by l.currency" ,
        nativeQuery = true)
List<Object[]> findTotalRevenueByCurrency(@Param("id0") UUID id0,
                                                     @Param("dateStart") Instant dateTimeStart,
                                                     @Param("dateEnd") Instant dateTimeEnd,
                                                     @Param("id1") UUID id1,
                                                     @Param("id2") UUID id2);

@Query(value=“选择l.currency,sum(l.price)作为第l“+”行的总收入,其中ol.id0=:id0和l.date\u时间介于:dateStart和:dateEnd和”+
“(强制转换(:id1作为文本)为空或强制转换(l.id1作为文本)=强制转换(:id1作为文本))和”+
“(强制转换(:id2作为文本)为空或强制转换(l.id2作为文本)=强制转换(:id2作为文本))”+
“按l.货币分组”,
nativeQuery=true)
列出按货币(@Param(“id0”)UUID id0查找的总平均值,
@参数(“dateStart”)即时dateTimeStart,
@参数(“日期结束”)即时日期时间结束,
@参数(“id1”)UUID id1,
@参数(“id2”)UUID id2);
这将返回一个对象列表,我使用以下代码手动将这些对象转换为
贴图

var result = orderLineRepository.findAveragePriceByCurrency(id0, orderDate.minus(2, DAYS), orderDate.plus(2, DAYS), id1, id2);

Map<String, BigDecimal> revenueByCurrency = result.stream()
    .map(arr -> Map.of((String) arr[0], (BigDecimal) arr[1]))
    .flatMap(m -> m.entrySet().stream())
    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));```

var result=orderLineRepository.findAveragePriceByCurrency(id0,orderDate.减(2天),orderDate.加(2天),id1,id2);
Map revenueByCurrency=result.stream()
.map(arr->map.of((字符串)arr[0],(BigDecimal)arr[1]))
.flatMap(m->m.entrySet().stream())
.collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue))```

这是非常脆弱的,需要铸造。是否有一种方法可以让此查询立即返回
Map

您可以创建一个自定义类来匹配此查询的结果,然后将结果列表映射到映射

public class CustomQueryResult {
 //class properties
 public CustomQueryResult(String currency, BigDecimal price) {
    //assign 
 }
}
@Query(value = "SELECT new CustomQueryResult(l.currency, sum(l.price) as total_revenue) from line l " + "where ol.id0 = :id0 and l.date_time between :dateStart and :dateEnd and " +
        "(cast(:id1 as text) is null or cast(l.id1 as text) = cast(:id1 as text)) and " +
        "(cast(:id2 as text) is null or cast(l.id2 as text) = cast(:id2 as text))" +
        "group by l.currency" ,
        nativeQuery = true)
List<CustomQueryResult> findTotalRevenueByCurrency(@Param("id0") UUID id0,
                                                     @Param("dateStart") Instant dateTimeStart,
                                                     @Param("dateEnd") Instant dateTimeEnd,
                                                     @Param("id1") UUID id1,
                                                     @Param("id2") UUID id2);

var result = orderLineRepository.findAveragePriceByCurrency(id0, orderDate.minus(2, DAYS), orderDate.plus(2, DAYS), id1, id2);

 Map<String, BigDecimal> revenueByCurrency = result.stream()
                .collect(Collectors.toMap(k -> k.getCurrency(), v -> v.getPrice());
公共类CustomQueryResult{
//类属性
public CustomQueryResult(字符串货币,BigDecimal价格){
//分配
}
}
@查询(value=“选择新的CustomQueryResult(l.currency,sum(l.price)作为总收入)来自第l“+”行,其中ol.id0=:id0和l.date\时间介于:dateStart和:dateEnd和之间”+
“(强制转换(:id1作为文本)为空或强制转换(l.id1作为文本)=强制转换(:id1作为文本))和”+
“(强制转换(:id2作为文本)为空或强制转换(l.id2作为文本)=强制转换(:id2作为文本))”+
“按l.货币分组”,
nativeQuery=true)
列出按货币(@Param(“id0”)UUID id0查找的总平均值,
@参数(“dateStart”)即时dateTimeStart,
@参数(“日期结束”)即时日期时间结束,
@参数(“id1”)UUID id1,
@参数(“id2”)UUID id2);
var result=orderLineRepository.findAveragePriceByCurrency(id0,orderDate.减(2天),orderDate.加(2天),id1,id2);
Map revenueByCurrency=result.stream()
.collect(Collectors.toMap(k->k.getCurrency(),v->v.getPrice());

您是否尝试过将返回类型设置为
Map