Java Spring数据,JPQL,按日期列的年份和月份分组
我有一个工作的原生MySQL查询,通过按年份和月份分组日期列来获取一些数据(例如:2017-01、2017-02) 有了这个,我可以得到预期的输出 现在,我花了两天的时间将这个结果输入到我的spring boot项目中。尝试了命名本机查询、存储过程和方法签名模式。但每次尝试都失败了。最后,我不得不放弃使用git客户端所做的更改 我试图实现的是按部分日期分组,将结果映射到自定义Pojo,或者在spring应用程序中获取行MySQL结果 请帮我做这件事Java Spring数据,JPQL,按日期列的年份和月份分组,java,mysql,spring,spring-mvc,stored-procedures,Java,Mysql,Spring,Spring Mvc,Stored Procedures,我有一个工作的原生MySQL查询,通过按年份和月份分组日期列来获取一些数据(例如:2017-01、2017-02) 有了这个,我可以得到预期的输出 现在,我花了两天的时间将这个结果输入到我的spring boot项目中。尝试了命名本机查询、存储过程和方法签名模式。但每次尝试都失败了。最后,我不得不放弃使用git客户端所做的更改 我试图实现的是按部分日期分组,将结果映射到自定义Pojo,或者在spring应用程序中获取行MySQL结果 请帮我做这件事 在JPql中是否有一种方法可以按部分日期分
- 在JPql中是否有一种方法可以按部分日期分组,如“分组方式” MySQL中的日期格式(production.production\u DATE,%Y-%m'),如果是 请举个例子好吗
- 如何从spring数据中的本机查询中获取作为列表或相关的行MySQL结果
- 有没有关于如何将存储过程结果映射到spring数据中的自定义POJO的示例
问题已解决
我通过在JPQL中混合使用MySQL函数DATE_格式(xxx,%Y-%m')实现了这一要求,我真的不知道如何混合这两种格式,但它是有效的。 My working spring函数和查询:
@Query(value = "SELECT "
+ " new com.trendsmixed.fma.dao.MonthlyScheduleAdherence(DATE_FORMAT(operation.production.productionDate,'%Y-%m'), SUM(operation.actualQuantity), SUM(operation.plannedQuantity), (SUM(operation.actualQuantity)/SUM(operation.plannedQuantity))*100) "
+ " FROM Operation operation"
+ " WHERE operation.production.productionDate BETWEEN :startDate AND :endDate"
+ " AND operation.production.controlPoint.workCenter.costCenter.section= :section"
+ " GROUP BY DATE_FORMAT(operation.production.productionDate,'%Y-%m')")
public List getMonthlyScheduleAdherenceBySection(@Param("startDate") Date startDate, @Param("endDate") Date endDate, @Param("section") Section section);
要映射结果的POJO:
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class MonthlyScheduleAdherence {
String month;
long actualTotal;
long plannedTotal;
long adherence;
}
由此我得到:
[
{
month: "2017-02",
actualTotal: 8640,
plannedTotal: 10664,
adherence: 81
},
{
month: "2017-03",
actualTotal: 8907,
plannedTotal: 10352,
adherence: 86
},
{
month: "2017-04",
actualTotal: 3224,
plannedTotal: 4164,
adherence: 77
},
{
month: "2017-05",
actualTotal: 8545,
plannedTotal: 12435,
adherence: 68
}
]
这就是我想要的。
我用这些数据成功地做到了这一点。
谢谢Sql函数在JPQL中可用。我的JPA版本是1.11.9。你的日期格式函数对我不起作用。我对分组按天使用函数查询:
@Query(value = "SELECT count(ac) as count, function('date_format', max(ac.subscriptionStartDate), '%Y, %m, %d') as date FROM MyTable ac " +
"WHERE ac.subscriptionStartDate BETWEEN :startDate AND :endDate GROUP BY function('date_format', ac.subscriptionStartDate, '%Y, %m, %d')")
public List<Map<String,Object>> findRegisteredCustomersHistory(@Param("startDate") Date startDate, @Param("endDate") Date endDate);
JPQL中的简单函数查询:
@Query(value = "SELECT function('date_format', s.date, '%Y, %m, %d') as date from Transactions s;")
count: 3, date: 2019, 09, 10
count: 1, date: 2019, 09, 11
@Query(value = "SELECT function('date_format', s.date, '%Y, %m, %d') as date from Transactions s;")