2016-02-25 3 views
2

Есть ли способ построить SQL по этапам/этапам с помощью jOOQ? Что-то вроде:Поэтапное/поэтапное/условное построение SQL в jOOQ

 DSLContext create = DSL.using(conn, SQLDialect.MYSQL); 
     DSL dsl = create.from(table("links")); 
     if(!StringUtils.isEmpty(place)) { // place is specified, change the query 

      long placeId = getPlaceId(); 

      if (placeId > 0) { 
          dsl = create.from(table("place_links")) 
          .join(table("links")) 
          .on(field("links.id").equal(field("place_links.link_id"))) 
          .where(field("place_links.place_id").equal(placeId)); 
      } 
     } 

     String sql = dsl.select(field("*")) 
       .orderBy("links.score") 
       .limit(1) 
       .getSQL(); 

Вышеуказанное не будет компилироваться, но я ищу что-то на аналогичных принципах. Мне нужно начать с from, так как целевая таблица изменяется во время выполнения.

Требование в том, что окончательные изменения запроса во время выполнения в зависимости от значений, которые подаются в.

ответ

2

SQL не чувствует себя очень наборный язык, если вы начинаете построения SELECT заявление сразу. Но если вы думаете о различных предложениях как о динамических строительных блоках, вещи сразу становятся намного проще. В вашем случае:

Table<?> from = table("links"); 
Condition where = trueCondition(); 

if (!StringUtils.isEmpty(place)) { 
    long placeId = getPlaceId(); 

    if (placeId > 0) { 
     from = from.join("place_links").on("links.id = place_links.link_id"); 
     where = where.and("place_links.place_id = ?", placeId); 
    } 
} 

DSL.using(conn) 
    .selectFrom(from) 
    .where(where) 
    .orderBy(field("links.score")) 
    .limit(1) 
    .fetch(); 

выше приобретает этот

import static org.jooq.impl.DSL.*; 

Подробнее о том, как строить операторы SQL динамически jOOQ описано здесь: http://www.jooq.org/doc/latest/manual/sql-building/dynamic-sql

+0

Очень умный. Я только что отредактировал, чтобы исправить строку после 'if (placeId> 0) {'. Полагаю, вы имели ввиду 'from', но писали' table'. Все остальное выглядит великолепно. –

+0

@ MugomaJ.Okomba: Да. Спасибо за редактирование –