2014-07-13 1 views
2

jOOQ에서 동적으로 생성 된 쿼리에서 절 (내 경우에는 order by 절)을 제거 할 수 있습니다. 나는 order by 절을 변경하거나 만jOOQ 쿼리에서 절 (순서)을 제거 할 수있는 방법

select * from myTable where (fk = 1) 

를 얻기 위해 제거 할

DSLContext create = DSL.using(SQLDialect.POSTGRES); 
SelectQuery<Record> query = create.select().from("myTable").where("fk = 1").orderBy(DSL.field("pk")).getQuery(); 
System.out.println(query.getSQL()); 
// select * from myTable where (fk = 1) order by pk asc 

가능한 메이크업이이 jOOQ에인가? :

쿼리를 생성 한 후 가정하자 가능하지 않은 경우 누구나이를 허용하는 쿼리 빌더 라이브러리를 알고있는 사람도 환영받을 것입니다.

+1

으로 가야한다. –

+0

물론 내가 할 수 있고 더 나은 디자인으로 이끌 것입니다. 나는 단지 내 옵션을 알고 싶다;) –

답변

3

현재 공개 API를 통해 수행 할 수 없습니다. 향후 jOOQ 4.0에서 일 수 있습니다. the DSL API and the Model API으로 구분되어 있습니다.이 모델 API를 사용하면 SELECT 절에서 개체를 다시 제거하는 등 모든 쿼리 부분을 자유롭게 조작 할 수 있습니다.

는 지금, 두 가지 옵션이 있습니다 :

  1. 당신이 그것을 필요 여부를 알 때까지 ORDER BY 절을 추가하지 마십시오 로직의

    SelectQuery<?> select = create 
        .select() 
        .from("myTable") 
        .where("fk = 1") 
        .getQuery(); 
    
    if (someCondition) 
        select.addOrderBy(DSL.field("pk")); 
    

    대체 조각 :

    List<SortField<?>> orderBy = new ArrayList<>(); 
    
    if (someCondition) 
        orderBy.add(DSL.field("pk").asc()); 
    
    create.select() 
         .from("myTable") 
         .where("fk = 1") 
         .orderBy(orderBy); 
    
  2. 를 사용하여 쿼리를 사후 처리/변환합니다.또는 VisitListener. 이것은 가장자리 - 경우에 대한 해결 방법입니다. 특정 경우

, 당신은 아마 당신이 그것을 필요로 할 때 당신이 그것을 추가 할 수 있도록 당신이 당신의 논리를 재 작업 할 수없는 옵션 (1) 대신에 의해 순서를 제거

+0

고마워요 @ LukasEder. 코드에서 더 나은 디자인으로 이어지기 때문에 먼저 갈 것입니다. 프로젝트에 기술적 인 부채가 있기 때문에 옵션 만 알고 싶습니다. –

+0

@FranciscoPuga : jOOQ 코드가있는 기술적 부채를 의미합니까, 아니면 jOOQ를 도입하기 전에 말입니까? 첫 번째 옵션에 다른 코드 예제를 추가했습니다. 아마도 더 나은 접근 방법 일 것입니다. –

+0

나는 나 자신을 정확하게 설명하지 않는다. 이전에는 jOOQ를 사용하지 않았습니다. 감사합니다. @LukasEder –