SQL Error: 1064, SQLState: 42000 in @Query - JPA, MySQL, Hibernate

半腔热情 提交于 2021-01-28 08:13:24

问题


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<List<WebsiteDailyTotal>> getDailyTotalUsage(@PathVariable("dateParam") String dateParam) {

        LocalDate ld = LocalDate.parse(dateParam.subSequence(0,dateParam.length()));
        LOGGER.info("ld: {}", ld.toString());

        List<WebsiteDailyTotal> websiteTotalUsage = service.getDomainTotal2(ld);
        return  new ResponseEntity<List<WebsiteDailyTotal>>(websiteTotalUsage, new HttpHeaders(), HttpStatus.OK);
    }

JPA Repository:

        public interface TotalDomainRepository2 extends JpaRepository<SuperStatEntityTime, Long> {
        @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<WebsiteDailyTotal> 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


回答1:


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<WebsiteDailyTotal> countTotalDomainUsageByDay2(@Param("startOfDay") LocalDateTime startOfDay,
                                                           @Param("endOfDay") LocalDateTime endOfDay);


来源:https://stackoverflow.com/questions/63352754/sql-error-1064-sqlstate-42000-in-query-jpa-mysql-hibernate

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!