728x90
반응형
728x90
반응형
반응형

환경: springboot2.7.6(hibernate core 5.6.14), spring-jpa, java 11, mysql5.7

 

spring jpa를 이용하여 아래 쿼리를 질의하려고 할 때

select (@rank := @rank +1) as ranking,
hutw.* 
from user_stat_weekly hutw, (select @rank := 0) as ranking
where hutw.start_date ='2024-02-05'
order by hutw.prize_total desc

 

@를 사용한 사용자 변수는 native query를 사용해야 한다.

 

허나 그냥 사용하면 아래와 같은 에러가 발생한다.

Caused by: org.hibernate.QueryException: Space is not allowed after parameter prefix ':'

:= @rank 이 부분에서 발생하는 것인데, 하이버네이트 버전에 따라 역슬래시를 하나나 두 개 넣어야 한다고 한다.

내가 사용하는 버전에서는 아래처럼 두 개 넣었더니 성공한다.

SELECT (@rank \\:= @rank +1) ...

 

잘 지나가나 싶어서 실행해 보면 아래 에러가 발생하는데, 해당 에러는 native query 결과를 object에 세팅할 때 class를 매핑해서 나는 것으로 projection interface로 바꾸면 해결된다.

No converter found capable of converting from type [org.springframework.data.jpa.repository.query.AbstractJpaQuery$TupleConverter$TupleBackedMap] to type
728x90
반응형
반응형

환경: java 17, springboot 2.7.6

 

아래 라이브러리를 사용하여 JWT토큰 파싱할 때 에러날 경우

소스:

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>
subject = Jwts.parser().setSigningKey(environment.getProperty("token.secret"))
        .parseClaimsJws(jwt).getBody()
        .getSubject();

에러:

java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter
	at io.jsonwebtoken.impl.Base64Codec.decode(Base64Codec.java:26) ~[jjwt-0.9.1.jar:0.9.1]
	at io.jsonwebtoken.impl.DefaultJwtParser.setSigningKey(DefaultJwtParser.java:151) ~[jjwt-0.9.1.jar:0.9.1]
	at com.example.gatewayservice.filter.AuthorizationFilter.isValidJwt(AuthorizationFilter.java:54) ~[classes/:na]

 

해결:

아래 디펜덴시를 추가하면 해결

    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.1</version>
    </dependency>

 

https://medium.com/@jiri.caga/java-lang-classnotfoundexception-javax-xml-bind-datatypeconverter-in-java-17-solved-499d0ea776d0

728x90
반응형
반응형

환경: springboot2.7.6, mysql, spring jpa

 

mybatis 사용 시 where절에 대한 동적 쿼리를 작성하는 일이 다분했는데,

jpa를 사용하면서 어떻게 하면 효율적 일지 고민하게 된다.

변수 한두개면 그냥 일반적인 jpa문을 여러 개 만들어두고 서비스단에서 분기 쳐서 서로 다른 repository의 함수(정적인 쿼리)를 가져오게 했는데,

옵션이 되는 변수가 많아지면 가독성에도, 관리에도 어려움이 있는 코드가 된다.

그리하여.. where절을 동적으로 변환할 수 있는 방법이 있나 찾아본다.

 

 

1. Specification & Criteria

Specification을 사용하면 자바 코드를 작성하 듯 쿼리를 작성할 수 있다.

허나 직관적으로 SQL문이라는 생각이 안 들고..

사용법도 복잡해서 개인적으로 선호하지 않는다..

https://docs.spring.io/spring-data/jpa/reference/jpa/specifications.html 

 

2. query dsl 활용

BooleanBuilder를 사용하여, 여러 조건을 빌더에 담을 수 있다.

 1번 방법보다는 가독성이 좋긴 하지만,, 이 역시 자바코드로 작성하기에 if문이 많아질 수 있다는 부담이 있다..

또한 query dsl 특성상 컴파일을 따로 하여 Q클래스를 만들고 이를 기반으로 작성되는데,,

컴파일 시 에러가 나면 이후에 모든 컴파일에서 에러가 난 것으로 보여 컴파일 에러 원인을 찾기가 어려웠던 경험이 있고

잡다하게 만들어야 하는 클래스들이 많아서 개인적으로 안 좋아한다.

https://samuel-mumo.medium.com/dynamic-queries-and-querydsl-jpa-support-in-spring-a1b4e233084b

 

3. JPQL에서 작성하기

개인적으로 좋아하는 쿼리 작성법이다.

아래와 같이 작성하면 dto의 값이 있는지 없는지에 따라서 다음 쿼리 적용 유무를 판단한다.

(:#{#request.arenaId} IS NULL OR t.arenaId = :#{#request.arenaId})

주의해야 할 점은 OR절이 있다 보니 관련 조건에 꼭 괄호처리를 하여 한다. 그렇지 않으면 전체가 조회될 수도..

허나 IN 절 작성 시.. 몇몇 에러를 만났는데. 아래에 기술한다.


참고로 request.sequences는 리스트 타입이다.

에러

 Antlr.NoViableAltException: unexpected AST node: {vector}

해결

is null 앞절에(List에) 괄호 추가

+ "AND ((:#{#request.sequences}) IS NULL OR t.seq IN :#{#request.sequences}) "

 

에러

Caused by: java.sql.SQLException: Operand should contain 1 column(s)

해결

coalesce 사용

https://www.w3schools.com/sql/func_mysql_coalesce.asp

+ "AND (COALESCE(:#{#request.sequences}) IS NULL OR t.seq IN :#{#request.sequences}) "

 

에러

h2를 이용한 repository 테스트를 진행할 경우, 아래와 같은 에러가 발생한다.

Caused by: org.h2.jdbc.JdbcSQLNonTransientException: Unknown data type: "?"; SQL statement:

coalesce의 쓰임새가 h2와 mysql이 다르다는 소리다.

실제로 h2에서는 coalesce가 사용되지 않은 쿼리도 문제없이 작동했다.

하지만 나는 h2와 mysql 모두를 만족시켜야 하므로.. 좀 더 연구해 보니 아래와 같은 쿼리가 나오게 된다..

+ "AND ((COALESCE(:#{#request.sequences}, t.seq) = t.seq) OR t.seq IN :#{#request.sequences}) "

그래서 최종 쿼리의 모양새는

 @Query(value =
      "SELECT new com.model.Response(t.seq, t.startDate, t.dismissedDate, t.seatCnt, t.prizeTotal) "
          + "FROM Table t " + "WHERE (:#{#request.arenaId} IS NULL OR t.arenaId = :#{#request.arenaId}) "
          + "AND ((COALESCE(:#{#request.sequences}, t.seq) = t.seq) OR t.seq IN :#{#request.sequences}) "
          + "AND t.startDate >= :#{#request.startDate} AND t.dismissedDate <= :#{#request.endDate} ")
  Page<Response> getRecords(Request request, Pageable pageable);

의미론적인 에러

위와 같이 작성하여 프로그래밍적인 에러는 피했는데, 막상 데이터를 조회해보니 잘못 조회되는 부분이 있었다.

in절에 대한 문제였는데, 위 쿼리를 보면서 설명한다.

  1. sequences는 List<Long>이고 화면에서 받아오는 값이 아닌, id의 유무에 따라 서버에서 받아서 채워 넣는 값이다. 최초에 null이다.
  2. id가 있으면 디비에서 조회해서 세팅을 해주고 없으면 emptyList가 들어간다.
  3. id가 있지만 참여를 하지 않아 디비에 데이터가 없으면 최종적으로는 getRecord함수가 emptyList로 반환되기를 원했다.
  4. 하지만 위 쿼리는 sequences 값의 emptyList와 null을 구분하지 않는다. 
    1. COALESCE(:#{#request.sequences}, t.seq) = t.seq 이 부분이 true가 되어서 다음 AND 절로 넘어간다.
  5. 그래서 null의 전체조회 의미와 emptyList의 참여하지 않음이 같은 결과를 내게 된다..
    1. 즉, 참여하지 않은 사람이 전체에 참여한 것처럼 나온다.

따라서 사용에 주의해야한다!!

728x90
반응형
반응형

환경: springboot2.7, java 17, maven

 

h2를 내장하는 테스트 프로젝트 생성

아래와 같이 설정했다고 가정

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.200</version>
    <scope>runtime</scope>  # <-- 기본이 test 로 되어 있고, 이러면 프로젝트에서 사용할 수 없음
</dependency>
spring:
  h2:
    console:
      enabled: true
      settings:
        web-allow-others: true
      path: /h2-console   // H2 콘솔 사용한다는 뜻
  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:mem:test  //db 연결 후 테이블 자동 생성

하지만 서버가 뜨고 db 연결 시 아래와 같은 에러 발생

testdb 데이터베이스를 springboot실행 시 자동 생성해주어야 하는데 그렇지 못함.

H2 1.4.198 이후 버전부터는 보안 문제로 자동으로 디비를 생성하지 않음.

h2 버전의 문제로 1.4 -> 1.3.176으로 낮추면 해결됨

((최신 버전으로 해도 그러는지 확인 필요))

 


 

h2를 메인으로 쓰면서, 서비스 시작 시 entity 테이블을 자동으로 생성하고자 하는 경우

application.yml에 아래처럼 작

spring:
  h2:
    console:
      enabled: true
      settings:
        web-allow-others: true
      path: /h2-console
  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:mem:test
  jpa:
    defer-datasource-initialization: true   ###
    hibernate:
      ddl-auto: create-drop
    show-sql: true
    generate-ddl: true

springboot 2.5 이상에서는 위처럼 defer-datasource-initialization 값을 추가해야 한다.

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.5-Release-Notes#hibernate-and-datasql

 

Spring Boot 2.5 Release Notes

Spring Boot. Contribute to spring-projects/spring-boot development by creating an account on GitHub.

github.com

 

+ 초기 데이터까지 넣어야 한다면

/resources 경로에 data.sql 파일로 쿼리를 넣으면, entity 생성 후 자동 실행한다.

728x90
반응형
반응형

springboot 버전과 spring cloud 버전이 맞지 않은 경우

Caused by: java.lang.ClassNotFoundException: org.springframework.boot.logging.DeferredLogFactory

또한 terminal에서 mvn spring-boot:run 명령어로 실행할 경우 home으로 잡혀있는 자바/mvn으로 시도하기 때문에 호환이 안될 수 있는데, 이럴 때는 자바 경로를 명시적으로 지정하고(혹은 자바 홈을 바꾸고..) 실행해야한다.

 

 

springboot 2.3.8

  • spring cloud Hoxton.SR12 버전과 맞고
  • java 11로 실행해야 함
<properties>
    <java.version>11</java.version>
    <spring-cloud.version>Hoxton.SR12</spring-cloud.version>
</properties>

자바 버전이 안 맞으면 아래 에러 발생

ASM ClassReader failed to parse class file - probably due to a new Java class file version that isn't supported yet

 

application routing 시 api gateway로 zuul을 사용했었는데

springboot2.4부터 fadeout 되어서 더 이상 사용 불가다. spring cloud gateway를 사용하라고 한다.

실 서비스로 zuul을 더이상 사용할 수는 없게 되었지만, 테스트 프로젝트 생성 시 2.3.8 정도로 사용해야 한다.

728x90
반응형
반응형

mysql8 이상으로 디비를 업그래이드를 하고 서버를 띄우면 아래 에러가 나면서 뜨지 않을 때가 있다..

Caused by: com.mysql.cj.exceptions.UnableToConnectException: Public Key Retrieval is not allowed

 

 

기존에 아마 useSSL = false 로 사용하고 있었을 건데, connection 맺을 때 아래 설정값이 추가로 필요하다.

allowPublicKeyRetrieval=true

이 값을 connection 정보에 추가하면 된다. 아래처럼..

jdbc:mysql://730a7c5e-9fb5-4~~~:13306/dbname?useUnicode=true&useSSL=false&allowPublicKeyRetrieval=true&characterEncoding=UTF8&serverTimezone=Asia/Seoul

 

728x90
반응형
반응형

 

junit5 mockito로 테스트 코드 작성 시 

사용하지 않는 given 절이 있다면 아래와 같은 에러를 만나며 테스트 실패 처리된다.

org.mockito.exceptions.misusing.UnnecessaryStubbingException:  Unnecessary stubbings detected.

사용하지 않는 given 절을 지우면 되긴 하는데..

공통으로 사용하고 싶어서 만든 가정절이라면(ex. clock mocking) 그래서 굳이..? 싶다면 아래와 같은 어노테이션을 클래스 단에 추가하면 된다.

@ExtendWith(MockitoExtension.class)
@MockitoSettings(strictness = Strictness.LENIENT)  //추가
728x90
반응형
반응형

대충 아래와 같이 수정

plugins {
    id 'org.springframework.boot' version '3.1.2'
    id 'io.spring.dependency-management' version '1.0.15.RELEASE'
    id 'java'
    id "org.sonarqube" version "3.0"
    id 'jacoco'
}

ext {
    querydslVersion = '5.0.0'
    set('springCloudVersion', "2021.0.5")
}

...
sourceCompatibility = '17'
dependencies{ ...

 	implementation "com.querydsl:querydsl-jpa:${querydslVersion}:jakarta"
	annotationProcessor "com.querydsl:querydsl-apt:${querydslVersion}:jakarta"
	annotationProcessor "jakarta.persistence:jakarta.persistence-api"
	annotationProcessor "jakarta.annotation:jakarta.annotation-api"

	runtimeOnly 'com.mysql:mysql-connector-j'
    
    ...

 

1. 빌드 그래들 에러

PermittedSubclasses requires ASM9

gradle 7.2 -> 7.6로 업그래이드

 

2. javax.* -> jakarta.*

intellij를 이용해서 전체 변환

https://www.jetbrains.com/guide/java/tutorials/migrating-javax-jakarta/use-migration-tool/#:~:text=From%20the%20menu%2C%20navigate%20to,a%20preview%20of%20the%20refactorings.

 

Using IntelliJ IDEA's migration tool

Migrating to Java EE with IntelliJ IDEA's refactoring tool

www.jetbrains.com

 

2-1. 하지만 에러가 남..

DataSource는 javax로 둬야하는 듯..?

import javax.sql.DataSource;

 

3. mysql meta builder

MetadataBuilderContributor 가 deprecated 되어 사용불가 

FunctionContributor 를 사용해야하는 듯..

근데 아직 잘 모르겠음

 

4. webclient onStatus 함수 변경

boolean -> predicate<httpStatusCode> 로 변경됨

 

5. 시작하면 아래와 같은 에러가 나는데...

java.lang.ClassNotFoundException: javax.servlet.http.HttpServletRequest

아마도 springfox 스웨거 때문인 것 같다...

 

6. 스웨거 다 옮기면.. ehcache도 수정해야할 듯..? javax 사용하는데 문제없는지 확인 필요

728x90
반응형
반응형

build.gradle

plugins {
    id 'org.springframework.boot' version '2.7.6'
    id 'io.spring.dependency-management' version '1.0.15.RELEASE'
    id 'java'
    id "org.sonarqube" version "3.0"
    id 'jacoco'
}

ext {
    querydslVersion = '5.0.0'
    set('springCloudVersion', "2021.0.5")
}

수정하고 빌드하고 프로그램 시작하면 아래와 같은 에러가 날 텐데..

org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; 
nested exception is java.lang.NullPointerException

application.properties에 아래 추가

spring.mvc.pathmatch.matching-strategy=ANT_PATH_MATCHER

테스트 돌릴 때 아래와 같은 에러가 나면.. 테스트 application.properties에도 잊지 말고 추가

Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang
.NullPointerException: Cannot invoke "org.springframework.web.servlet.mvc.condition
.PatternsRequestCondition.getPatterns()" because "this.condition" is null

원인

path maching 기본 전략이 2.6부터 ant matching -> path pattern으로 변경됨

AntPathMatcher는 간단하고 기존의 코드와의 호환성을 제공하는 반면, PathPattern은 성능과 유연성 측면에서 더 우수합니다. 스프링 부트 2.6.0부터 기본 매칭 전략으로 PathPattern이 도입되었으며, 보다 복잡한 URL 구조를 효율적으로 처리할 수 있도록 돕습니다.

 


 

h2 test 에러

springboot2.5.6; h2 1.4.200 

h2로 레파지토리 테스트를 하고 있다. 아래 entity가 있으면 테스트 실행 시 아래 쿼리가 자동으로 실행되면서 테이블이 생성된다.

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private BigInteger seq;
 create table `item_withdraw_log` (
       `seq` decimal(19,2) not null auto_increment,
       ...

이렇게 잘 사용하고 있었는데.. 버전업을 하고 테스트가 실패한다.

 

springboot2.7.6; h2 2.1.214

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private BigInteger seq;
Caused by: org.h2.jdbc.JdbcSQLFeatureNotSupportedException: Feature not supported: "DECIMAL(19, 2)"; SQL statement:

같은 create 쿼리를 실행하는데 decimal관련 에러가 난다.

 

mysql bigint는.. 꼭..?! 자바의 long으로 해야 하는 듯..

아니면 아래 어노테이션 추가...

@Column(precision = 100, scale = 0)
//100은 좀 심하고 디비의 최대 자릿수 정도로 하면 될 듯

허나.. 테스트를 위한 어노테이션은 혼동스러울 것 같아 BigInteger -> Long을 변환하는 게 나을 것 같다.

https://www.h2database.com/html/migration-to-v2.html

 

Migration to 2.0

Contents Introduction Upgrading File Format Data types Identity columns and sequences INFORMATION_SCHEMA General Introduction Between version 1.4.200 and version 2.0.202 there have been considerable changes, such that a simple update is not possible. It wo

www.h2database.com


jpa native query 에러

2.5.6 버전에서 사용하고 있던.. 잘 돌아가던 쿼리가 있다.

  @Query(value = "SELECT * FROM hd_user_leaderboard_data_log AS huldl " + "WHERE huldl.gid = :gid AND huldl.base_date > :baseDate "
      + "AND huldl.leaderboard_id IN :leaderboardIds " + "AND huldl.extra_data ->> '$.ArenaType' = :arenaType ORDER BY huldl.log_date DESC ",
         nativeQuery = true)
Page<UserLeaderboardDataLog> findAllByGidAndBaseDateAfterAndArenaTypeAndLeaderboardIdNotIn(String gid,
    LocalDateTime baseDate,
    String arenaType,
    Set<Integer> leaderboardIds,
    Pageable pageable);

 

컴파일 시 문제는 없었는데 서버 시작 후 api를 호출하니 아래와 같은 에러가 발생..

Caused by: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
..
Caused by: java.sql.SQLSyntaxErrorException: Unknown column 'huldl' in 'field list'
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
    ..

심지어 하이버네이트 실행 쿼리가 지나가고, 그걸 긁어서 db client 툴에 붙여 넣고 실행하면 잘 나온다.

사용하던 쿼리기도 하고 쿼리 자체에는 문제가 없다는 사실 확인..

그러면 왜 나는 거지..

해결 1.

에러 내용이 huldl 관련 에러라.. 우선 alias를 지워본다..

@Query(value = "SELECT * FROM leaderboard_data_log " + "WHERE gid = :gid AND base_date > :baseDate "
    + "AND leaderboard_id IN :leaderboardIds " + "AND extra_data ->> '$.ArenaType' = :arenaType ORDER BY log_date DESC ", nativeQuery = true)

성공..

해결 2.

다른 글을 보니 alias에 backtick(`)를 사용하면 된다고 해서.. 해봤는데 잘 된다..

@Query(value = "SELECT * FROM hd_user_leaderboard_data_log AS `huldl` " + "WHERE `huldl`.gid = :gid AND `huldl`.base_date > :baseDate "
    + "AND `huldl`.leaderboard_id IN :leaderboardIds " + "AND `huldl`.extra_data ->> '$.ArenaType' = :arenaType ORDER BY `huldl`.log_date DESC ",
       nativeQuery = true)

https://stackoverflow.com/questions/74055494/native-query-does-not-recognized-in-query-in-spring-data-jpa

 

Native query does not recognized in @Query in spring data jpa

When I define a query method in ContactRepository and write a native mysql query in @Query, it gives the following error. What is the reason? Can't I write an alias for the table? @Repository public

stackoverflow.com

해결 3.

alias를 asd로 바꿔보니 잘된다..ㅋㅋ 역시 huldl이 뭔가 있음

@Query(value = "SELECT * FROM hd_user_leaderboard_data_log AS asd " + "WHERE asd.gid = :gid AND asd.base_date > :baseDate "
    + "AND asd.leaderboard_id IN :leaderboardIds " + "AND asd.extra_data ->> '$.ArenaType' = :arenaType ORDER BY asd.log_date DESC ",
       nativeQuery = true)

 

아무래도 버전 2.7.6으로 바꾸면서 alias로 둔 huldl이 잘못 변환되거나 예약어 거나 그런 것 같다.

 

*) 참고로 native query = false 인 기본 jpa에서 콜롬/테이블 명에 나도 모르게 예약어를 사용하여 에러가 날 수도 있는데, 이를 방지하기 위해서 아래 설정을 추가하면 jpa에서 쿼리 만들어서 실행할 때 해당 이름에 알아서 backtick을 붙여서 날려준다.

spring.jpa.properties.hibernate.globally_quoted_identifiers=true

 


참고

https://chartio.com/learn/sql-tips/single-double-quote-and-backticks-in-mysql-queries/

 

Single Quote, Double Quote, and Backticks in MySQL Queries

Using Backticks, Double Quotes, and Single Quotes when querying a MySQL database can be boiled down to two basic points: Quotes (Single and Double) are used …

chartio.com

 

728x90
반응형
반응형

환경: springboot2.5+, mysql

 

일반적으로 테이블은 아래와 같이 camel case 사용한다.

그래서 spring에 아래의 설정을 적용하고 엔티티에 camel case로 콜롬을 받는다.

(springboot3 기준)

spring.jpa.properties.hibernate.physical_naming_strategy=org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy
spring.jpa.properties.hibernate.implicit_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy

(springboot2 기준)

spring.jpa.properties.hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
spring.jpa.properties.hibernate.implicit_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy

(entity)

@Id
private BigInteger idSeq;
private String configType;
private String configName;
private LocalDateTime startDate;
private LocalDateTime endDate;
private String data;
private Short active;
private String regAdmin;
private String modAdmin;
private LocalDateTime regDate;
private LocalDateTime modDate;

 

 

근데 진짜 간혹 가다 아래와 같이.. camel case가 든 테이블이 섞여있는 경우가 있다.

이 entity의 column은 어떻게 정의해야 할까?

그래서 제일 먼저 생각나는 @Column을 이용해 재정의를 해본다.

@Column(name = "startTimeMillis")
private BigInteger startTimeMillis;
@Column(name = "expiryTimeMillis")
private BigInteger expiryTimeMillis;
@Column(name = "autoRenewing")
private String autoRenewing;

하지만 physical 설정은 맨 마지막에 적용되기 때문에..

startTimeMillis로 가져오라고 명명한 콜롬 역시 start_time_millis로 디비를 조회하여 에러가 난다.

그럼 어떻게 하지? 이 몇 개의 테이블 때문에 위 hibernate strategy를 포기하자니,, 모든 콜롬명을 재정의할 자신이 없다..

(PhysicalNamingStrategyStandardImpl 로 사용해야 할 것 같은데 이러면 기존 자바 속성값을 다 @Column(name= 언더스코어네임)으로 지정해야 하는 불편함이 생긴다..)

 

해결

쿼리를 짤 때 대소문자 구분이 없다는 사실이 떠올랐다.

즉, rewardCount, rewardcount, REWARDCount 건 쿼리는 잘 실행된다.

디비의 camel case 또한 사람의 눈에는 camel case 지만 컴퓨터한테는 별 의미 없는 구분인 것이다.

그래서 아래와 같이 @Column을 명명하고 사람의 눈에는 보기 좋아야 하니까 변수명에는 camel case로 구분하였다.

@Column(name = "starttimemillis")
private BigInteger startTimeMillis;
@Column(name = "expirytimemillis")
private BigInteger expiryTimeMillis;
@Column(name = "autorenewing")
private String autoRenewing;

별문제 없이 쿼리가 실행되는 것 확인하였다.

728x90
반응형

+ Recent posts