programing

스프링 부트 JPA 휴지 상태 - 밀리초의 정밀도로 저장 날짜

kingscode 2023. 1. 22. 22:39
반응형

스프링 부트 JPA 휴지 상태 - 밀리초의 정밀도로 저장 날짜

'2.3.' RELEASE'입니다.
11 1111
org..org. springframework 트: : spring - boot - jdbc
org..org. springframework 명령: spring-boot-data-jpa
spring-data-jpa-2.3.4.
파일:

DB DB MariaDB(버전 10.5.5-MariaDB)
Java MariaDB J:2.6.0 [Java MariaDB]

java.sql을 유지하려고 합니다.밀리초의 정밀도로 휴지 상태의 타임스탬프 개체입니다.날짜를 밀리초 단위로 DB에 저장해야 합니다.예를 들어 2020-10-08 03:23:38.454 입니다.

내 도메인:

import java.sql.Timestamp;
@Entity
@Data
@Table(name = "date_test")
public class DateTestDomain {
    @Id
    @Column(nullable = false, name = "date", columnDefinition = "TIMESTAMP(3)")
    @Temporal(TIMESTAMP)
    private Calendar dateTest;
}

내 보고서:

@Repository
public interface DateTestRepo extends JpaRepository<DateTestDomain, Timestamp> {
}

db에 날짜 저장:

private final JdbcTemplate db;
...
        long testTime = 1602120218454L;
        Timestamp dateTimeStamp = new Timestamp(testTime);
        db.update("INSERT INTO date_test" + " (date) VALUES( \"" + dateTimeStamp + "\")");

UPD: SQL 결과는 내가 원하는 대로 정확합니다!!!이 방법은 완벽합니다: 2020-10-08 03:23:38.454

, 휴지 상태에서는, 「」/는 FALSE.PA FALSE FALSE.
다음 중 하나:
값2020-10-09 22:26:53.120 입니다.
TRACE [ Main 2020-10-09 22:26:53.122 TRACE 95038 --- [ ]o.h.type.descriptor.sql. Binder : [ TIMESTamp [ - 10 - 22 ::. ]- [ TIMESTAMP ]- [ 2020 - 10 - 09 22 : 26 : 53 . 044 ]로서의 파라미터

        Calendar calendar = Calendar.getInstance();
        Date date = new Date();
        calendar.setTimeInMillis(date.getTime());
        dateTestDomain.setDateTest(calendar);

        dateTestRepo.save(dateTestDomain);

sql 결과: hibernate sql insert를 사용하면 fractional secondsql insert:

2020-10-09 22:26:53.000

제발 도와주세요.밀리초의 정밀도 JPA로 db 시간을 절약해야 합니다.

업데이트:

사투리 sql을 합니다.
org.hibernate.dialect.org.certificate 를 syslog.syslog.syslog를 사용합니다.MySQL5InnoDBDialect org.hibernate.dialect하다MySQL55InnoDBDialect org.hibernate.dialect하다MariaDB103 org.hibernate.dialect 。
성공하지 못하고
1 : 데:1 :
: INSERT date_test (, ) (NOW(3), ?) date_test timtim ( timestamp, local_date_timea)
TRACE [ 20-10-15:33:29.099 TRACE 44072 --- [ restartedMain ]o.h.type.descriptor.sql. Binder : [ TIMESTamp [ - 10 - : . ]- [ TIMESTAMP ]- [ 2020 - 10 - 15 : 33 : 29 . 051 ]로서의 파라미터
TRACE [ sql20-10-15:33:29.100 TRACE 44072 --- [ main ]o.h.type.descriptor.sql.기본 바인더 : [ TIMestamp ]- [ java . util ] ] [ 2 ]2 。GregorianCalendar[volid=1602336809051,areFieldsSet=true...

SQL 과 sqlSQL:
20-10 15:33:29.101, 2020-10 13:33:29.000, 2020-10 15:33:29.000.000.

을 사용하다
DB 짜 :
1657820-10 16:19:42.578
1600020-10 16:20:47.00020-10 16:47.000
1688820-10 16:20:47.888
2020-10-10 16:20:47.892
2020-10-10 16:20:47.896
2020-10-10 16:20:47.900
휴지 상태: date_test datetestdo0_에서 datetestdo0_.timestamp를 timeam1_0_로 선택합니다.여기서 datetestdo0_.timestamp>?
바인딩 파라미터 [1]를 [TIMESTamp]- [2020-10-10 16:20:47.893]
2020-10-10 16:20:47.888
2020-10-10 16:20:47.892
2020-10-10 16:20:47.896
2020-10-10 16:20:47.9

jdbcsql:
date_test에서 타임스탬프를 선택합니다.여기서 timestamp>"timep-10 16:20:47.893"
2020-10-10 16:20:47.896
2020-10-10 16:20:47.900

jpa/certificate가 밀리초 동안 작동하지 않음...

JPA 2.2 이후 java8 date and time API가 지원됩니다.당신의 문제를 해결할 수 있을지는 아직 시도하지 않았지만 자바8로 시도해 볼 수 있나요?LocalDateTimeCalendardiscloss.discloss.

대체:

@Id
@Column(nullable = false, name = "date", columnDefinition = "TIMESTAMP")
@Temporal(TIMESTAMP)
private LocalDateTime localDateTime;
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(calendar.getTimeInMillis());

새로운 Date()를 사용하지 말고 이것을 사용해 보세요.

타임라인상의 단일 순간 포인트를 모델링하는 Instant를 사용하는 것이 좋습니다.

import java.time.Instant;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        Instant now = Instant.now();
        System.out.println(now);

        // Instant to milliseconds
        System.out.println(now.toEpochMilli());

        // Milliseconds to Instant
        Instant moment = Instant.ofEpochMilli(1602120218454L);
        // Print the default representation i.e. Instant#toString
        System.out.println(moment);
        // Which is same as the following output
        String strTimestampDefaultFormat = moment.toString();
        System.out.println(strTimestampDefaultFormat);

        // Custom representation with milliseconds precision
        String strTimestamp = moment.atOffset(ZoneOffset.UTC)
                .format(DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSS"));
        System.out.println(strTimestamp);
    }
}

샘플 실행의 출력:

2020-10-08T13:44:46.765240Z
1602164686765
2020-10-08T01:23:38.454Z
2020-10-08T01:23:38.454Z
2020-10-08 01:23:38.454

★★★★★★★★★★★★★★★★ strTimestamp얻은 ) 치환할 수 .

sql.append(" (date) VALUES( \"").append(dateTimeStamp).append("\")");

와 함께

sql.append(" (date) VALUES( \"").append(strTimestamp).append("\")");

언급URL : https://stackoverflow.com/questions/64262300/spring-boot-jpa-hibernate-storing-date-with-millisecond-precision

반응형