2015-12-09 1 views
0

Я пытаюсь сгенерировать динамический запрос в java, мне нужно создать ту же таблицу Cos_Class_Allocation, а также те же столбцы class_name = ? AND CLASS_ALLOCATION = ?. Как я могу очистить свой код в циклах, которые я заметил, я объявляю alloc, но не вызывал его, есть ли лучший способ писать циклы, а также как удалить последнюю запятую из первого цикла foreach и, наконец, удалить последний «And "из второго цикла foreach.Создайте динамический запрос в java с помощью строкового построителя

мой запрос должен выглядеть следующим образом:

SELECT * FROM TRAFFIC_PROFILE 
     WHERE COS_MODEL = 'cos4' AND DIRECTION = 'Egress' 

      AND (PE_INGRESS_FLAG = 'Y' OR PE_EGRESS_FLAG = 'Y') 

     and TRAFFIC_PROFILE_ID IN (

     select distinct (C1.Traffic_PROFILE_ID) from Cos_Class_Allocation C1, 
     Cos_Class_Allocation C2, Cos_Class_Allocation C3, 
     Cos_Class_Allocation C4, Cos_Class_Allocation C5, Cos_Class_Allocation C6 
     where c1.class_name = ? AND c1.CLASS_ALLOCATION = ? 
     and c2.class_name = ? AND c2.CLASS_ALLOCATION = ? 
     and c3.class_name = ? AND c3.CLASS_ALLOCATION = ? 
     and c4.class_name = ? AND c4.CLASS_ALLOCATION = ? 
     and c5.class_name = ? AND c5.CLASS_ALLOCATION = ? 
     and c6.class_name = ? AND c6.CLASS_ALLOCATION = ? 
     and C1.TRAFFIC_PROFILE_ID = c2.TRAFFIC_PROFILE_ID 
     and C1.TRAFFIC_PROFILE_ID = c3.TRAFFIC_PROFILE_ID 
     and C1.TRAFFIC_PROFILE_ID = c4.TRAFFIC_PROFILE_ID 
     and C1.TRAFFIC_PROFILE_ID = c5.TRAFFIC_PROFILE_ID 
     and C1.TRAFFIC_PROFILE_ID = c6.TRAFFIC_PROFILE_ID) ; 

код:

private String buildTrafficProfileByCosClassAllocationQuery(TrafficProfileExtension.CosModel cosModel, Direction direction, List<ClassOfServiceAllocation> cosAllocation, RouterType routerType){ 
    StringBuilder builder = new StringBuilder(); 

    builder.append(queryByDirectionRouterTypeAndCosClassAllocation); 
    builder.append(buildRouterQuery(routerType)); 
    builder.append("and TRAFFIC_PROFILE_ID IN (select distinct (C1.Traffic_PROFILE_ID) from "); 
// builder.append(buildCosModelQuery(cosModel)); 


    int i = 1; 

    for(ClassOfServiceAllocation alloc : cosAllocation){ 
     builder.append(" Cos_Class_Allocation c" + i++ +","); 

    } 
    builder.append(" where " ); 
    int n = 1; 
    int a =1; 

    for(ClassOfServiceAllocation alloc : cosAllocation){ 
    builder.append("c" + n++ + ".class_name = ? AND c" + a++ + ".CLASS_ALLOCATION = ? AND "); 

    } 

    int tp = 2; 
    for(ClassOfServiceAllocation alloc : cosAllocation){ 
     builder.append("and C1.TRAFFIC_PROFILE_ID = c" + tp++ + ".TRAFFIC_PROFILE_ID "); 
    } 


    return builder.toString(); 
} 

это ниже выход: (У меня есть дополнительный AND и дополнительное после последней таблицы comma)

SELECT * FROM TRAFFIC_PROFILE 
WHERE COS_MODEL = ? AND DIRECTION = ? 
AND (PE_INGRESS_FLAG = 'Y' OR PE_EGRESS_FLAG = 'Y') 
and TRAFFIC_PROFILE_ID IN ( 
select distinct (C1.Traffic_PROFILE_ID) 
from Cos_Class_Allocation c1, Cos_Class_Allocation c2, 
Cos_Class_Allocation c3, Cos_Class_Allocation c4, 
Cos_Class_Allocation c5, Cos_Class_Allocation c6, 
where c1.class_name = ? AND c1.CLASS_ALLOCATION = ? 
AND c2.class_name = ? AND c2.CLASS_ALLOCATION = ? 
AND c3.class_name = ? AND c3.CLASS_ALLOCATION = ? 
AND c4.class_name = ? AND c4.CLASS_ALLOCATION = ? 
AND c5.class_name = ? AND c5.CLASS_ALLOCATION = ? 
AND c6.class_name = ? AND c6.CLASS_ALLOCATION = ? 
AND and C1.TRAFFIC_PROFILE_ID = c2.TRAFFIC_PROFILE_ID 
and C1.TRAFFIC_PROFILE_ID = c3.TRAFFIC_PROFILE_ID 
and C1.TRAFFIC_PROFILE_ID = c4.TRAFFIC_PROFILE_ID 
and C1.TRAFFIC_PROFILE_ID = c5.TRAFFIC_PROFILE_ID 
and C1.TRAFFIC_PROFILE_ID = c6.TRAFFIC_PROFILE_ID 
+1

Не могли бы вы высказать свой код. –

+0

только что опубликовал код – Gio

+0

Вызывает ли приведенный выше код правильную строку? Если это так, вы должны перейти в CodeReview.stackexchange –

ответ

0

Мне удалось создать свой динамический запрос, используя for for вместо fore байт.

private String buildTrafficProfileByCosClassAllocationQuery(TrafficProfileExtension.CosModel cosModel, Direction direction, List<ClassOfServiceAllocation> cosAllocation, RouterType routerType){ 
    StringBuilder builder = new StringBuilder(); 

    builder.append(queryByDirectionRouterTypeAndCosClassAllocation); 
    builder.append(buildRouterQuery(routerType)); 
    builder.append("and TRAFFIC_PROFILE_ID IN (select distinct (C1.Traffic_PROFILE_ID) from "); 
// builder.append(buildCosModelQuery(cosModel)); 


    for (int i = 1; i <= cosAllocation.size(); i++) { 
      if (i > 1) builder.append(","); 
     builder.append(" Cos_Class_Allocation c").append(i); 
    } 

    for (int i = 1; i <= cosAllocation.size(); i++) { 
      builder.append(i == 1 ? " where " : " and "); 
      builder.append("c").append(i).append(".class_name = ? AND c").append(i).append(".CLASS_ALLOCATION = ?"); 
     if (i > 1) { 
       builder.append(" and C1.TRAFFIC_PROFILE_ID = c").append(i).append(".TRAFFIC_PROFILE_ID"); 
     } 
    } 

    builder.append(")"); 

    return builder.toString(); 
} 

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

  • Нет связанных вопросов^_^