Java .Util.Date Проблема запроса с JPA и параметром привязки Hibernates - PullRequest
2 голосов
/ 10 апреля 2020

Я сейчас работаю с Springboot. Теперь я хочу запросить данные по Java .util.date через JpaRepository, и у меня есть следующий код в моем интерфейсе.

List<MyEnity> findByDate(Date date);

Я использую Java .util.date, и у меня есть личная причина что я не мог изменить на java .time. Я гарантировал, что MyEntity Class в поле даты имеет TemporalType.DATE, например

@Temporal(TemporalType.DATE) private Date date;

, а также поле даты в MySQL также date type

введите описание изображения здесь Я пытался использовать метод findByDate(Date date), описанный выше, и параметр date в методе, очевидно, существует в моей базе данных, но я всегда получаю пустой список ...

Другие методы, такие как findByName(String name) или findAll(), работают отлично.

Я попытался записать оператор SQL в hibernate, и обнаружил, что параметр привязки [DATE] может быть в другом формате? в моем БД 'гггг-мм-дд'

вот журнал, где я запрашиваю с идентификатором и датой. и в нижней части журнала я заметил, что идентификатор связан с оператором запроса, но дата не будет

    2563-04-10 12:18:54.649 [restartedMain] INFO  o.s.b.d.a.ConditionEvaluationDeltaLoggingListener - Condition evaluation unchanged
2563-04-10 12:19:03.241 [http-nio-8080-exec-2] INFO  o.a.c.c.C.[.[.[/api/productionplan] - Initializing Spring DispatcherServlet 'dispatcherServlet'
2563-04-10 12:19:03.282 [http-nio-8080-exec-2] INFO  o.s.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet'
2563-04-10 12:19:03.307 [http-nio-8080-exec-2] INFO  o.s.web.servlet.DispatcherServlet - Completed initialization in 8 ms
2563-04-10 12:19:03.346 [http-nio-8080-exec-2] DEBUG org.hibernate.SQL - 
    select
        planibtout0_.planibtoutid as planibto1_23_,
        planibtout0_.ibtqty as ibtqty2_23_,
        planibtout0_.finisheddate as finished3_23_,
        planibtout0_.finishedshiftid as finished4_23_,
        planibtout0_.itemid as itemid6_23_,
        planibtout0_.itemclassid as itemclas5_23_,
        planibtout0_.planfinishedgoodid as planfini7_23_,
        planibtout0_.planibtoutlotid as planibto8_23_,
        planibtout0_.planqty as planqty9_23_,
        planibtout0_.producerstoreid as produce10_23_,
        planibtout0_.sellerstoreid as sellers11_23_,
        planibtout0_.updateat as updatea12_23_,
        planibtout0_.updateby as updateb13_23_
    from
        planibtout planibtout0_
    where
        planibtout0_.producerstoreid=1117
        and planibtout0_.finisheddate=?
2563-04-10 12:19:03.359 [http-nio-8080-exec-2] TRACE o.h.type.descriptor.sql.BasicBinder - binding parameter [1] as [DATE] - [Tue Apr 15 00:00:00 ICT 1477]
2563-04-10 12:19:03.363 [http-nio-8080-exec-2] INFO  c.n.t.t.s.c.SellerStoreController - -Data Not Found- No record found in database

вот мои свойства .yml

    server:
  port: 8080
  servlet:
    context-path: /api/xxx/

spring:
    datasource:
      url: jdbc:mysql://localhost:3306/xxx?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
      driverClassName: com.mysql.cj.jdbc.Driver
      username: xxx
      password: 
      continueOnError: false
      maximum-pool-size: 20
      minimum-idle: 0
      idle-timeout: 10000
      connection-timeout: 10000
      max-lifetime: 10000
      auto-commit: true

    jpa:
      show-sql: false
      hibernate:
        ddlAuto: none
      properties:
        hibernate:
          dialect: org.hibernate.dialect.MySQLDialect
          format_sql: true

startDayInWeek: 2

logging:
  level:
    com.zaxxer.hikari.HikariConfig: DEBUG
    com.ntt.th: DEBUG
  pattern:
    console: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"

1 Ответ

1 голос
/ 10 апреля 2020

На самом деле, нет проблем с привязкой Date, поэтому запрос выполняется отлично. Возможно, проблема в том, что часовой пояс приложения и часовой пояс базы данных не совпадают.

Вы отправляете DATE с часовым поясом IndoChina (ICT) Tue Apr 15 00:00:00 ICT 1477, но используете serverTimezone=UTC (в JDB C Url) для база данных, что означает, что вы используете UT C Часовой пояс для базы данных.

Таким образом, вы можете изменить часовой пояс для базы данных, используя serverTimezone=ICT, чтобы использовать IndoChina Timezone (ICT)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...