2015-01-15 4 views
1

У меня есть критерий создания с использованием нескольких параметров с разбиением на страницы. Проблема, что у меня есть это, если можно повторно использовать код внутри и для других, создайте критерии, совершенно разные, witouth должен дублировать код. Я заявляю, что если у меня есть случаи createcriteria и вы хотите сделать те же «фильтры» на case2, вам не нужно дублировать код, унифицировать оба createCriteria не вариант Например, проблема, с которой я сталкиваюсь, - это то, что должен быть с разбивкой по страницам, а другим не нужно, и оба должны иметь доступ к отдельным полям, поэтому уникальным вариантом является создание двух одинаковых критериев создания, если я что-то не пропущу. Это пример, что случаи не менее чем на 90% с индексом для case2, и что было бы хорошим режимом для повторного использования кода?Множество критериев создания повторного использования кода grails

def cases = PpCase.createCriteria().list{ 
      and{ 
       if(limit){ 
        maxResults(limit) 
       } 
       firstResult(offset) 
       order("mostRecentPaymentDate", "desc") 
       order("totalAmount", "desc") 
       if(params.admin_id){ 
        eq("adminId",params.admin_id) 
       } 
       if(params.status){ 
        eq("status",params.status.toUpperCase() as PpCase.Status) 
       } 
       if(params.date_from){ 
        ge('dateCreated', Date.parse("yyyy-MM-dd",params.date_from)) 
       } 
       if(params.date_to){ 
        le('dateCreated', Date.parse("yyyy-MM-dd",params.date_to)) 
       } 
       if(params.date_closed_from){ 
        ge('closedDate', Date.parse("yyyy-MM-dd",params.date_closed_from)) 
       } 
       if(params.date_closed_to){ 
        le('closedDate', Date.parse("yyyy-MM-dd",params.date_closed_to)) 
       } 
     } 
} 

def cases2 = PpCase.createCriteria().list{ 
      and{ 
       firstResult(offset) 
       order("mostRecentPaymentDate", "desc") 
       order("totalAmount", "desc") 
       if(params.admin_id){ 
        eq("adminId",params.admin_id) 
       } 
       if(params.status){ 
        eq("status",params.status.toUpperCase() as PpCase.Status) 
       } 
       if(params.date_from){ 
        ge('dateCreated', Date.parse("yyyy-MM-dd",params.date_from)) 
       } 
       if(params.date_to){ 
        le('dateCreated', Date.parse("yyyy-MM-dd",params.date_to)) 
       } 
       if(params.date_closed_from){ 
        ge('closedDate', Date.parse("yyyy-MM-dd",params.date_closed_from)) 
       } 
       if(params.date_closed_to){ 
        le('closedDate', Date.parse("yyyy-MM-dd",params.date_closed_to)) 
       } 
     } 
} 

Более реальный пример: В тех случаях, мне нужно несколько полей, но с ограничением, и в cases2 мне нужно разные поля, и witouth предел, I'm дублировании 90% кода.

 def cases = PpCase.createCriteria().list{ 
       projections { 
        sum("field1") 
        countDistinct("id") 
       } 
       and{ 
       if(limit){ 
        maxResults(limit) 
       } 
      //HERE SHOULD BE THE CODE THAT I NEED TO REUTILIZE 
} 
def cases2 = PpCase.createCriteria().list{ 
       projections { 
        sum("field2") 
        countDistinct("id") 
       } 
       and{ 

      //HERE SHOULD BE THE CODE THAT I NEED TO REUTILIZE 
} 

ответ

2

Я не уверен, что вы имеете в виду, когда говорите: «Унифицировать оба createCriteria не вариант», особенно учитывая в приведенном выше коде, вы выполняете тот же самый запрос дважды и заканчиваете двумя списками, содержащими одни и те же строки ,

Один из способов повторного использования ваших критериев - просто определить критерии как отдельное закрытие и передать это для созданияCriteria.

Closure fetchPayments = { 
     and{ 
      if(limit){ 
       maxResults(limit) 
      } 
      firstResult(offset) 
      order("mostRecentPaymentDate", "desc") 
      order("totalAmount", "desc") 
      if(params.admin_id){ 
       eq("adminId",params.admin_id) 
      } 
      if(params.status){ 
       eq("status",params.status.toUpperCase() as PpCase.Status) 
      } 
      if(params.date_from){ 
       ge('dateCreated', Date.parse("yyyy-MM-dd",params.date_from)) 
      } 
      if(params.date_to){ 
       le('dateCreated', Date.parse("yyyy-MM-dd",params.date_to)) 
      } 
      if(params.date_closed_from){ 
       ge('closedDate', Date.parse("yyyy-MM-dd",params.date_closed_from)) 
      } 
      if(params.date_closed_to){ 
       le('closedDate', Date.parse("yyyy-MM-dd",params.date_closed_to)) 
      } 
    } 
} 

def cases = PpCase.createCriteria().list(fetchPayments) 
def cases2 = PpCase.createCriteria().list(fetchPayments) 
+0

Да, пример такой же createCriteria, чтобы упростить вещи, но код немного отличается, делать разные проекции, а части, которые нужно повторно использовать, - это и {} условия createCriteria, я загружу пример –

+0

. real –

+0

В этом случае это просто небольшое изменение первоначального ответа; сохраняя ваше отдельно установленное закрытие «fetchPayments», просто назовите это закрытие как часть вашего построения критериев, где вам понадобятся два сценария. ' случаи DEF = PpCase.createCriteria(). Список { delegate.with fetchPayments /* Случаи 1 конкретные критерии здесь * /} Защиту cases2 = PpCase.createCriteria(). Список { delegate.with fetchPayments /* случаев 2 конкретных критерия здесь */ } ' – Poundex

2

Вы можете сделать это с помощью имени запроса: имеют вид к документации. namedQueries

+0

Я проверю его, я получу ответ, чтобы открыть еще немного, чтобы узнать, есть ли у меня другой ответ! –

3

Я хотел бы использовать "where" queries, которые используют DetachedCriteria под капотом, или DetachedCriteria directly. где запросы не запускаются до тех пор, пока вы не назовете list/get/count/exists/deleteAll/updateAll, поэтому они отличные кандидаты на составление запросов по частям. Именованные запросы также могут быть скомпонованы, но они должны быть полными, исполняемыми запросами, но частичный, где запрос прекрасен, пока вы добавляете недостающие части через композицию перед их запуском. Они также более гибкие, поскольку вы можете использовать их для удаления и обновления.

Смежные вопросы