Насколько сложными будут эти пользовательские запросы? Произвольный SQL? Или вы можете использовать HQL или Критерии (и я действительно имею в виду то, что вы позволите пользователям определять своего рода QBE в пользовательском интерфейсе, но именно вы будете создавать фактический запрос)? В последнем случае фильтры тоже могут помочь.
Я бы не стал беспокоиться о (1), если только результаты запроса не являются простыми списками. Вы можете представлять иерархии / отношения в XML, но я сомневаюсь, что ваши пользователи оценят это, поскольку им придется это обрабатывать. И подход toString () в значительной степени гарантирует обратную реакцию, потому что разные пользователи обязаны интересоваться разными визуализациями одного и того же объекта (например, если вы возвращаете список As, которые связаны с B, user1 захочет получить другой результат от B.toString ( ) затем user2).
(2) должно работать, если вам действительно нужны произвольные SQL-запросы. В зависимости от того, насколько сложна ваша база данных и сколько у вас пользователей, вы можете обойтись созданием представлений (для каждого пользователя) вместо реальных копий базы данных.