Doma mysql,SQL错误:1064,SQLState:@Query中的42000-JPA,MySQL,Hibernate

I am using JPA Query for MySQL database. I am passing String date in

http://localhost:8081/stat/visits/2020-07-29

as PathVariable - but getting an error in JPA Repository in Query:

I am using Java8 LocalDateTime and for parameter LocalDate. Something is wrong with binding. Here are my classes and bellow the error:

Controller

@GetMapping("/visits/{dateParam}")

public ResponseEntity> getDailyTotalUsage(@PathVariable("dateParam") String dateParam) {

LocalDate ld = LocalDate.parse(dateParam.subSequence(0,dateParam.length()));

LOGGER.info("ld: {}", ld.toString());

List websiteTotalUsage = service.getDomainTotal2(ld);

return new ResponseEntity>(websiteTotalUsage, new HttpHeaders(), HttpStatus.OK);

}

JPA Repository:

public interface TotalDomainRepository2 extends JpaRepository {

@Query("SELECT new com.proctorio.webtracker.entity.WebsiteDailyTotal(c.domain, SUM(c.duration)) FROM SuperStatEntityTime AS c WHERE c.start.toLocalDate() = :localDate GROUP BY c.domain ORDER BY c.domain ASC")

public List countTotalDomainUsageByDay2(@Param("localDate") LocalDate localDate);

}

Entity class:

@Entity

@Table(name = "super_stat2")

public class SuperStatEntityTime {

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

private Long id;

@Column

private String uuid;

@Column

private String domain;

@Column(name = "start", columnDefinition = "TIMESTAMP")

private LocalDateTime start;

@Column(name = "end", columnDefinition = "TIMESTAMP")

private LocalDateTime end;

@Column

private Long duration;

Database table:

CREATE TABLE `super_stat2` (

`id` bigint NOT NULL AUTO_INCREMENT,

`domain` varchar(255) DEFAULT NULL,

`start` datetime DEFAULT '0000-00-00 00:00:00',

`end` datetime DEFAULT '0000-00-00 00:00:00',

`duration` bigint DEFAULT '0',

`uuid` varchar(255) DEFAULT NULL,

PRIMARY KEY (`id`)

)

The Result class:

public class WebsiteDailyTotal {

private String domainUrl;

private Long totalTime;

public WebsiteDailyTotal() {

}

public WebsiteDailyTotal(String domainUrl, Long totalTime) {

this.domainUrl = domainUrl;

this.totalTime = totalTime;

}

There is an error:

Hibernate:

select

superstate0_.domain as col_0_0_,

sum(superstate0_.duration) as col_1_0_

from

super_stat2 superstate0_

where

c.start.toLocalDate()=?

group by

superstate0_.domain

order by

superstate0_.domain ASC

o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [DATE] - [2020-07-29]

o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 1064, SQLState: 42000

It is syntax error. The query is successful without where clause. Please, help me with this. Thanks

解决方案

You can't use toLocalDate() directly in JPQL. An easier way to fix this calculate start of day and end of day of localdate and do between query using them.

LocalDateTime startOfDay = localDate.atTime(LocalTime.MIN);

LocalDateTime endOfDay = localDate.atTime(LocalTime.MAX);

and query like c.start between BETWEEN :startOfDay AND :endOfDay

@Query("SELECT new com.proctorio.webtracker.entity.WebsiteDailyTotal(c.domain, SUM(c.duration)) "

+"FROM SuperStatEntityTime AS c WHERE c.start between BETWEEN :startOfDay AND :endOfDay GROUP BY c.domain ORDER BY c.domain ASC")

public List countTotalDomainUsageByDay2(@Param("startOfDay") LocalDateTime startOfDay,

@Param("endOfDay") LocalDateTime endOfDay);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值