2017-01-02 4 views
2

나는 상속 체인의 일부인 3 개 테이블 A, BC 한에서 :잘못된 필드 jOOQ 녹음

A 
/\ 
B C 

과 같이 : 열 이름은

A(row_id) 
B(row_id, a_row_id REFERENCES A(row_id)) 
C(row_id, a_row_id REFERENCES A(row_id)) 

주 있음 같은 (a_row_id)

이제 및인 을 가져옵니다. 수행하여가 :

ctx.select() 
    .from(
     Tables.A 
     .leftOuterJoin(Tables.B).onKey() 
     .leftOuterJoin(Tables.C).onKey() 
    ) 
    .where(someCondition) 
    .fetch() 

I 가입 I (이 시점에서) 내가 찾고있는 하나 모르기 때문에 B 모두 이상과 C.

ctx.select() 
    .from(
     Tables.A 
     .leftOuterJoin(Tables.B).onKey() 
    ) 
    .where(someCondition) 
    .fetch() 

내가 record.field(Tables.B.A_ROW_ID).toString()을한다면, 내가 "b.a_row_id"를 얻을 수있는에 Record를 얻을, 나는 record.getValue(Tables.B.A_ROW_ID)을 할 경우 내가 예상 가치를 얻을 : 내가 B을 가져오고이 작업을 수행 할 필요가 알고

하지만, .

그러나 record.field(Tables.C.A_ROW_ID).toString()을 입력하면 "b.a_row_id"이되고 record.getValue(Tables.C.A_ROW_ID)record.getValue(Tables.B.A_ROW_ID)이됩니다.

부모 테이블을 참조하는 열 이름이 동일하기 때문에 이러한 현상이 발생한다고 생각합니다.

그것이 조인의 유일한 테이블 인 경우 테이블의 field_name (정규 "table.field_name"이 아닌) 만 사용하는 jOOQ입니까?

이 문제에 대한 도움을 주시면 대단히 감사하겠습니다. Record.field(Field), Record.field(Name)Record.field(String) 모든

답변

1

의미 체계가 동일하고 일관된 논리를 따르 SQL에서

을, 기록의 열은 이름이 있습니다. 이 이름은 테이블/뷰 (카탈로그의 스키마)에서 비롯된 경우 정규화 될 수 있지만 선택 사항입니다. 규정되지 않은 항목도 완벽하게 괜찮습니다. 때

  • 이 경우 같은 JOIN .. USING를 사용 col + 1
  • 등의 표현을 만들기 열
  • 을 앨리어싱있는 열은
  • 테이블 이름을 가질 수 파생 테이블 (사용 자격이 아니지만, 확실히 스키마/카탈로그가 아님)
  • SELECT *PIVOT, MODEL, MATCH_RECOGNIZE과 같은 공급 업체별 열 방출 연산자와 함께 사용하십시오. 당신이 볼 수 있듯이

은 구문 관점에서 갖는 규정 화 된 열 이름은 예외없는 규칙이다.따라서, Record.field(Field)의 가장 합리적이고 일반적으로 유용하게 구현하는 것입니다

  • 레코드 (정규화 된 열 이름)이 실패하면
  • 의 내부 정확한 일치 찾기, 내부의 대략 일치하는 항목을 찾을 수 있습니다
      : 그 경우, 기록 (비정규 열 이름)
    • "모호한" (최상위 선택은 모호성을 허용하기 때문에)의

0
  • jOOQ 3.8+ logs a warning
  • jOOQ 4.0+ will throw an exception 그래서, 당신이 관찰 한 동작은 올바른 것입니다.

  • 1

    루카스는 이미 주요 질문에 대답했지만, 나는 결국 당신에게 jOOQ가 SQL 문을 실행 중임을 주목하고 싶다. 보안 및 캐싱에 대한 경계가 있지만 여전히 SQL 문입니다. 로깅을 켜면 SQL 자체를 볼 수 있습니다.
    동적 레코드가 반환되고 열이 X가되도록하려면 데이터를 쉽게 읽을 수 있도록 .as ("X")를 항상 수행 할 수 있습니다.