사용자 도구

사이트 도구


java:querydsl:nativesql

QueryDSL Native SQL

XxxQueryFactory 를 사용하여 쿼리를 시작하라

SQL 생성시 schema 이름도 함께 출력

  • 아래와 같이 printSchema() 를 지정해야만 schema.tableName 형태로 SQL 생성
    SQLTemplates mysqlTemplates = MySQLTemplates.builder().printSchema().build();
  • 단, MySQL의 경우 schema 개념이 없어서 코드 생성시 코드 값이 올바로 안들어간다. 따라서 Meta Class 생성시 schema name이 null로 생성된다. 아래와 같이 하면 schema 지정이 가능해진다.
    QUser qUser = 
      new QUser("user_alias", "user_schema_name", "user_table_name");

XXXSQLQuery의 확장

  • XXXSQLQuery 클래스를 확장하여 각 DB만의 특수 문법을 추가하는 것이 가능하다.
  • JPASQLQuery 에서 native query 추가 : MySQLQuery 같은 순수 Native SQL 용 Query 클래스를 참조하여 addFlag,addJoinFlag 등을 작성해주면 된다. 혹은 JPASQLQuery를 상속하여 addFlag,addJoinFlag 등을 미리 구현해 둔 클래스를 만들어 사용하는 것도 방법이다.

문제점

  • 현재 catalog 개념을 지원하지 않는다. MS SQL Server 에서 여러 카탈로그(database)에 걸친 쿼리 작성이 불가능하다.
    • MySQL 은 스키마 지정으로 가능하다.
    • SQLSerializer를 수정하여 테이블 앞에 'catalog'.'dbo'.'tablename' 으로 붙여주면 된다.
    • SQLSerializerAbstractSQLClauseAbstractSQLQuery 에서 생성된다.
    • 따라서 위 두 클래스를 상속하는 클래스에서 createSerializer 메소드를 오버라이드 하여 원하는 대로 수정한 SQLSerializer를 생성해주면 된다.
    • 혹은 com.querydsl.sql.SQLTemplates#requiresQuotes 를 override 해서 schema 가 catalogname.dbo 이런식이면 false를 반환해도 될 것 같다. : SQLTemplates 의 DB전용 버전을 하나만 override 하면 되기 때문에 이게 제일 좋은 방법인 듯 하다.

infobip-spring-data-querydsl

참조

java/querydsl/nativesql.txt · 마지막으로 수정됨: 2022/01/21 23:23 저자 kwon37xi