Пишу на Java под Android, но, думаю, вопрос может быть актуален для любого языка.
Возникли сложности с хранением текста sql-запросов в коде. Пробовал несколько подходов, но каждый из них имеет свои недостатки:
1) Хранить запросы текстом как они есть. Но при этом сложно найти упоминание какого-либо столбца в коде, можно совершить опечатку, которую потом тяжело найти. Все недостатки хардкода налицо.
2) Хранить имена столбцов и таблиц как константы. Но тогда запросы вообще становятся абсолютно нечитабельными из-за множественных конкатенаций.
3) Использовать порождающие шаблоны типа строителей и фабрик для создания запросов. Но код тогда получается ненаглядным, и его слишком много. И опять же, как хранить имена столбцов внутри строителей?
4) Использовать какие-то ORM невозможно в силу некоторых особенностей системы.
Хотелось бы услышать, каким образом вы храните sql-запросы в коде.
Как раз переношу работу с базой из java в php. Если запросы не в виде sql, пусть даже со вставками, то что бы найти нужный, приходиться врубаться в код, что крайне затрудняет работу.
Либо уж ORM нормальный прикручивать, либо строками.
и плюс к тому запросы на много десятков строк, с кучей джойнов, группировок и тп
если я захочу его отдалить, то просто скопипастить из кода не получится — придётся от кавычек и плюсов чистить
Да, как-то я прозевал что у вас строки не переносятся =) Вообще камент выше очень хорош, держите все снаружи, как вариант в xml и просто подставляйте нужные значения. Отличный вариант + чистый код + все водном месте.
Придётся сделать некое подобие ORM или построителя запросов (последнее проще). Можно сделать построитель запросов из XML-определения (всё равно структурнее, чем SQL), имена таблиц и полей прописать как константы через механизм XSD…
а вот потом вам потребуется како-нибудь хитрый запрос с десятком джойнов и ещё бог знает с чем, который генерится по хитрому условию, выполнить в сторонней софтине, чтобы посмотреть план запроса и оптимизировать по необходимости. как вы код запроса восстановите?
если логгинг делать, то придётся приводить программу в нужное состояние. не зря я про хитрое условие писал — не всегда можно выполнить это условие, оно может от внешних факторов зависить. а перегенерировать тоже тяжело — нужно будте какое-то средство для генерации туда и обратно… я сам такие штуки делал, и убедился что не стоит оно того
Ну, в JPA 2 в CriteriaBuilder хитрые условия тоже можно строить, так что пример есть, и сложность построителя хитрых условий ограничена сложностью ссылания на поля разных джойнимых таблиц.