2017-12-10 14 views
0

저는 jOOQ를 처음 사용하고 쿼리를 jOOQ로 변환해야합니다.방법 orderby/group by/쿼리 jOOQ에서 찾지 못했습니다

내 테이블 "CN_THEODOINO"에는 NAM (YEAR을 의미)과 THANG (MONTH)의 두 필드가 있습니다. 데이터 형식은 short 및 byte입니다.

sysdate와 해당 테이블의 NAM 및 THANG 사이의 다른 달을 계산하고 싶습니다.

그런 다음 필자는 매개 변수의 p_diff와 비교하여 그보다 큰 매개 변수를 선택합니다.

나는이 시도 :

public List<CN_DS_NO> layDsKHangNo3(String sInputParam) throws JSONException { 
    try { 
     Calendar c = Calendar.getInstance(); 
     int currMonths = c.get(Calendar.YEAR) * 12 + c.get(Calendar.MONTH); 
     JSONObject jsonObj = new JSONObject(sInputParam); 
     short p_diff = (short)jsonObj.getInt("SO_THANGNO"); 
     Condition condition = DSL.trueCondition(); 
     condition = condition.and(bangDsChuyenNo2.TIEN_NO.gt(Long.valueOf(0))); 
     condition = condition.and(bangDsChuyenNo2.NAM.mul(12).add(bangDsChuyenNo2.THANG).add(p_diff).sub(currMonths).lessOrEqual((short)0)); 
     condition = condition.groupBy(bangDsChuyenNo2.MA_KHANG); 
     condition = condition.having(DSL.count(bangDsChuyenNo2.ID_HDON).gt(jsonObj.getInt("SO_HOADON")).and(DSL.sum((Field) field(bangDsChuyenNo2.TIEN_NO)).gt(jsonObj.getLong("TONG_NO")))); 

     qDsChuyenNo = this.getCreate() 
         .select() 
         .from(bangDsChuyenNo) 
         .where(condition); 
     return nativeQuery(this.getEm(), qDsChuyenNo, CN_DS_NO.class); 

      } catch (Exception ex) { 
      throw ex; 
      } 

내가 두 가지 오류를 얻을 말 :

오류 (141,34) : 기호를 찾을 수 없습니다; 심볼 : 메소드 groupBy (org.jooq.TableField); 위치 : org.jooq.Condition 유형의 변수 조건

오류 (142,34) : 기호를 찾을 수 없습니다. 심볼 : 메소드 데 (org.jooq.Condition); 위치 : org.jooq.Condition 타입의 변수 조건

그래서 어떻게해야할까요? 이미 Google과 포럼에서 검색했지만 답변을 얻을 수 없습니다. 도와주세요.

답변

0

유형은 SQL 술어를 모델링합니다. ANDOR 연산자를 사용하는 조건자를 결합하는 방법이 있지만 GROUP BY 또는 HAVING과 같이 SELECT 쿼리에 속하는 메서드는 확실하지 않습니다. 해당 조항을 속한 위치로 이동하십시오.

Condition condition = DSL.trueCondition(); 
condition = condition.and(bangDsChuyenNo2.TIEN_NO.gt(Long.valueOf(0))); 
condition = condition.and(bangDsChuyenNo2.NAM.mul(12).add(bangDsChuyenNo2.THANG).add(p_diff).minus(currMonths).greaterThan((short)0)); 

// These calls make no sense at this position: 
// condition = condition.groupBy(bangDsChuyenNo2.MA_KHANG); 
// condition = condition.having(DSL.count(bangDsChuyenNo2.ID_HDON).gt(jsonObj.getInt("SO_HOADON")).and(DSL.sum((Field) field(bangDsChuyenNo2.TIEN_NO)).gt(jsonObj.getLong("TONG_NO")))); 

qDsChuyenNo = this.getCreate() 
        .select() 
        .from(bangDsChuyenNo) 
        .where(condition) 

        // Above clauses moved down here: 
        .groupBy(bangDsChuyenNo2.MA_KHANG) 
        .having(DSL.count(bangDsChuyenNo2.ID_HDON) 
          .gt(jsonObj.getInt("SO_HOADON")) 
          .and(DSL.sum((Field) field(bangDsChuyenNo2.TIEN_NO)) 
          .gt(jsonObj.getLong("TONG_NO")))) 
        ; 
+0

통찰력을 얻은 Lukas에게 감사드립니다. curlMonths - p_diff - bangDsChuyenNo2 대신 bangDsChuyenNo2.NAM + bangDsChuyenNo2.THANG + p_diff - currMonths를 의미하는 bangDsChuyenNo2.NAM.mul (12) .add (bangDsChuyenNo2.THANG) .add (p_diff) .minus (currMonths)를 써야하나요? .NAM * 12 - bangDsChuyenNo2.THANG. 두 번째 것은 더 자연 (나에게) 인 것 같습니다. –

+0

제발, @ NghịLê : 당신은 새로운 질문을 할 수 있습니까? 스택 오버플로는 언제든지 질문 ID가 없어지지 않습니다. 이 의견에 질문에 답하기는 어렵습니다 ... –