Sql 如何在JPQL中将datetime转换为日期?
这个代码有什么问题Sql 如何在JPQL中将datetime转换为日期?,sql,spring,jpa,Sql,Spring,Jpa,这个代码有什么问题 @Query(value = "Select " + "date(ivd.trnDatetime) as date, " + "ivd.binNo as bin, " + "ivd.snNo as sn, " + "count(ivd.invoiceNo) as totInvoice, " + "sum(ivd.totSaleAmt) as totSaleAmt " + "from InvoiceData ivd where i
@Query(value = "Select " +
"date(ivd.trnDatetime) as date, " +
"ivd.binNo as bin, " +
"ivd.snNo as sn, " +
"count(ivd.invoiceNo) as totInvoice, " +
"sum(ivd.totSaleAmt) as totSaleAmt " +
"from InvoiceData ivd where ivd.status = 1 group by date(ivd.trnDatetime), ivd.binNo, ivd.snNo")
List<Object[]> getDailyTransactionReport();
实体中TrnDataTime的属性
@NotNull
@Column(name = "transaction_at", nullable = false)
private Instant trnDatetime;
SqlServer中的等效列是datetime错误消息告诉您,此时没有事务的值。这意味着表中的某些记录在处的事务_的值为空,或者查询出于某种原因未选择该值。您需要确保您选择了它,如果它为null,您将为它设置一个默认值,或者筛选出该特定字段的值为null的记录 此外,如果不一定需要事务_at的值,则可以从@Column中删除nullable=false 编辑
如注释部分所述,解决方案是CASTivd.trndatime as date错误消息告诉您,此时没有事务的值。这意味着表中的某些记录在处的事务_的值为空,或者查询出于某种原因未选择该值。您需要确保您选择了它,如果它为null,您将为它设置一个默认值,或者筛选出该特定字段的值为null的记录 此外,如果不一定需要事务_at的值,则可以从@Column中删除nullable=false 编辑 正如注释部分所指出的,解决方案是CASTivd.trndatime as dateJPQL不支持日期,因此您的查询失败。您有以下选项: 通过在@Query中设置nativeQuery=true,更改为使用本机SQL 如果您使用的是Hibernate,请使用将TrnDataTime强制转换为LocalDate的HQL特定命令: 选择castivd.trnDatetime作为LocalDate作为date, countivd.invoiceNo作为总发票 来自发票数据ivd 其中ivd.status=1 按castivd.trnDatetime分组为LocalDate 为了简洁起见,我忽略了其他列 请注意,结果列表的每个项目中的索引0都是LocalDate,JPQL不支持日期,因此您的查询失败。您有以下选项: 通过在@Query中设置nativeQuery=true,更改为使用本机SQL 如果您使用的是Hibernate,请使用将TrnDataTime强制转换为LocalDate的HQL特定命令: 选择castivd.trnDatetime作为LocalDate作为date, countivd.invoiceNo作为总发票 来自发票数据ivd 其中ivd.status=1 按castivd.trnDatetime分组为LocalDate 为了简洁起见,我忽略了其他列
请注意,结果列表的每个项目中的索引0都是LocalDate谢谢,但它在DB中也是一个不能为null的字段,并且在DB中该字段没有null值。@shovon然后您需要确保选择它。定义需要一个具有该名称的字段,而您的select没有。我认为问题在于转换。如果我使用CONVERTdate,ivd.transaction_at as date并设置nativeQuery=true,那么它工作正常。但它会使其特定于数据库。@如果将其命名为date,则在结果集中不会有任何事务。尝试CONVERTdate,ivd.transaction\u at as transaction\u atThanks,但它在DB中也是不可为空的字段,并且在DB中该字段没有空值。@然后您需要确保选择它。定义需要一个具有该名称的字段,而您的select没有。我认为问题在于转换。如果我使用CONVERTdate,ivd.transaction_at as date并设置nativeQuery=true,那么它工作正常。但它会使其特定于数据库。@如果将其命名为date,则在结果集中不会有任何事务。尝试CONVERTdate,ivd.transaction\u at as transaction\u at
@NotNull
@Column(name = "transaction_at", nullable = false)
private Instant trnDatetime;