> Должен ли я создать PreparedStatement для переменной SQL и вложить его в SQL2
нет
Нет
> Или должно быть несколько PreparedStatements на основе SQL2 без вложенности
Да
Более того: если бы вы могли создать одну строку для запроса, это было бы лучше. Я не очень люблю смешивать SQL с кодом. Это затрудняет отладку и понимание, вы не можете скопировать / вставить в инструмент SQL, чтобы легко его протестировать. Отделив SQL от вашего кода, вы изолируете свой запрос от операции (фактической выборки), и его будет проще поддерживать. Кроме того, если код не ваш, его будет намного легче понять.
Неважно, похоже, что вы повторяете строки, смысл в том, чтобы максимально упростить операторы.
Я бы сделал что-то вроде этого:
final class DatabaseQueries {
public final static String SOME_SCENARIO = "SELECT z WHERE x > y JOIN A, B ";
public final static String SOME_OTHER_SCENARIO = "SELECT z WHERE x <= y JOIN A, B";
}
А затем используйте его из своего класса:
PreparedStatement pstmt = getCon().prepareStatement( getQuery() );
private String getQuery() {
if( x != null ) {
return DatabaseQueries.SOME_SCENARIO;
} else {
return DatabaseQueries.SOME_OTHER_SCENARIO;
}
}
При создании класса «DatabaseQueries» вы обнаружите, что вы повторяете много строк, я думаю, что было бы неплохо заменить некоторую часть на другие константы.
final class DataBaseQueries {
// this one is private
private final static String JOIN_A_B = " join A, B ";
public final static String SOME_SCENARIO = "SELECT z WHERE x > y " + JOIN_A_B ;
public final static String SOME_OTHER_SCENARIO = "SELECT z WHERE x <= y " + JOIN_A_B ;
}
Смысл в том, чтобы упростить ситуацию. Это первый шаг. На втором шаге вы можете создать класс для создания тех запросов, которые действительно очень сложны, но, вероятно, YAGNI.
Если запросов слишком много, вы можете заменить их, чтобы загрузить их из ResourceBundle, как в этом вопросе
Надеюсь, это поможет.