Я тоже собираюсь исследовать эту тему. Я был виновен в написании подобного кода и никогда не чувствовал себя на 100% комфортно с ним. Я полагаю, я хотел бы найти что-то в «списках переменных параметров SQL».
В коде, используя hibernate и заданную строку идентификаторов порядка, разделенного запятыми, я использовал:
Session s = getSession();
Criteria crit = s.createCriteria(this.getOrderListingClass());
crit.add(Expression.sql(String.format("{alias}.orderId in (%s)", orderIds)));
crit.add(Expression.eq("status", OrderInfo.Order_STATUS_UNFILLED));
orders = crit.list();
В то время как orderId действительно является частью «SELECT x From y WHERE IN (% s)».
Я пропустил строку orderIds String через валидатор, прежде чем передать его в спящий режим - боясь инъекций и т. Д.
Что-то еще, что я хотел сделать, это проверить ограничение на параметры SQL и количество символов в запросе. Кажется, я вспоминаю о достижении лимита где-то около 2000+ (с MS SQL). Это то, что нужно учитывать, если вы идете с этим подходом.
Я думаю, что это глупо ... выдавать столько идентификаторов в предложении Where, но это часть кода, требующая рефакторинга. К счастью, в этом случае за один раз было запрошено всего несколько идентификаторов.