Здравствуйте, ·, Вы писали:
·>Плохо, что неочевидно. Показывает, что не сталкивался со сложными запросами, поэтому и считаешь что их реально генерить в compile time.
·>псевдокод такой примерно:
·>·>List<Product> getProducts(String categoryFilter)
·>{
·> if(categoryFilter == null)
·> return resultOfQuery(
·> "SELECT * FROM Product");
·> else
·> return resultOfQuery(
·> "SELECT * FROM Product p"+
·> " INNER JOIN Category c ON(c.id=p.categoryId)"+
·> " WHERE c.name LIKE '{categoryFilter}%'")
·>}
·>
·>а теперь представь себе что таких nullable-фильтров 10 штук. Получается 1024 варианта запросов.
Это шутка? Даже с этим ручным закатом солнца получается банально, в стиле
base = "SELECT * FROM Product p"
filter = []
if categoryFilter is not None:
base += " INNER JOIN Category c ON(c.id=p.categoryId)"
filter.append("c.name LIKE '{categoryFilter}%'")
... остальные 9 вариантов, которые могут модифицировать отдельные компоненты ...
## финализируем текст
request = base + (" WHERE " if filter else "") + " AND ".join(filter)
Сразу дисклеймер: нет, я не поддерживаю позицию alex_public, что это всё лучше делать так вручную — хотя бы потому, что я банально ленив (той ленью, которая достоинство программиста
), и в первую очередь побежал бы за готовым средством. Но и рассказ про 1024 варианта, мягко говоря, неадекватен.