Ну я лично не присутствовал при самом действе, но насколько я понял они снимают типо вот фотошоп незарегестрированный, вот еще что то и т.д.
Что дальше они будут делать не знаю. Сама ситуация с одной стороны смешная с другой хз что может грозить. По факту это веб студия на 5 человек, понятное дело никто там не думал нормальное ПО или нет, в 90% ИТ компаний в России юзают ломаное ПО. Все что нужно сотрудники ставили сами, никто за этим не следил.
Обычный statement будет работать быстрее, но такие запросы менее безопасны(вы сами отвечаете за безопасность) и хуже поддерживаются. Таким образом выигрывая в производительности вы проигрываете по другим критериям.
Если в вашем случае IN запрос каждый раз будет новый, то возможно стоит искать другие способы оптимизации(например временные таблицы или хранимые процедуры).
Здесь нельзя исправлять комментарии, вместо group_concat(`product_option_values`.`product_id`, ',') используйте group_concat(`product_option_values`.`product_id`) чтобы лишнюю запятую убрать.
А по поводу бага,
select `product_option_values`.`value`, count(`product_option_values`.`option_id`),
group_concat(`product_option_values`.`option_id`) from `product_options`
inner join `product_option_values` on `product_options`.`id` = `product_option_values`.`option_id` AND `product_option_values`.`product_id` in (1,2,3)
group by `product_option_values`.`value` having count(`product_option_values`.`product_id`) > 1;
Выполните этот вопрос и если он вернет какие то данные, значит option_id тоже не уникально для value в группировке.
Что выдает этот запрос на реальных данных?
select `product_option_values`.`value`, count(`product_option_values`.`product_id`),
group_concat(`product_option_values`.`product_id`, ',') from `product_options`
inner join `product_option_values` on `product_options`.`id` = `product_option_values`.`option_id` AND `product_option_values`.`product_id` in (1,2,3)
group by `product_option_values`.`value` having count(`product_option_values`.`product_id`) > 1;
Кратко Jenkins и подобные системы помогают автоматизировать различные интеграционные процессы вокруг вашего проекта(ов). Например это деплой в prod/test, запуск тестов, запуск сборок, повышение версий и выпуск релизов.
Возвращать ничего не нужно. Обычно где то сверху есть метод помеченный '@Transactional', он автоматически за вас сделает rollback в случае возникновения ошибки. Либо используйте где нибудь выше метода используйте EntityManager.getTransaction().begin/commit/rollback в try/catch.
Persist генерит id потому что вне транзакции(т.е. все операции сразу выполняются в БД). Это хреново, потому что весь процесс работы с БД не атомарен, а значит персистентность данных может быть нарушена(например тут может возникнуть ситуация когда не будет заполнен path).
Для форматирования кода комбинация в Eclipse ctrl + shift + f, в Intellij Idea ctrl + alt + l.
Метод flush как раз поможет сгенерировать id. Persist лишь добавляет объект в контекст EntityManager, flush же выполняет непосредственно запрос на вставку не закрывая транзакцию. Соответственно после того как выполнится flush в объекте category появится id(конечно это работает если поле автоинкрементится).
Выше я привел пример кода(может не корректно с первого раза работать но суть примерно такая). Там выполнится два запроса один на вставку, второй на update, поэтому обязательно нужно выполнять запросы в транзакции.
Код ужасен потому что сложно читать и мелкие ошибки, например
ошибка с parentId,
ResponseMessage в DAO методе,
название метода addCategory когда передается список в качестве параметра,
parentId можно было бы найти и выше по коду, а сюда передать уже найденный объект, либо вообще просетить его в объекты в списке и не передавать второй параметр
int в качестве id
код не отформатирован(пустые строки и отступы)
Сергей: Я потерял нить, мы сейчас о почтовых протоколах или о RestAPI? Просто в мире программирования это слабосвязанные вещи. Т.е. знание одного не подразумевает автоматическое знание второго. Я почти не касаюсь почты на работе, но очень активно работаю с Http протоколом и производными.
Сергей: На уровне пользователя? - элементарно, настроил один раз и забыл. Если же вы говорите о программировании, то у меня почти нет опыта работы с почтой. Если бы он был вероятно я не шел бы сюда с таким вопросом.
Единственная причина - я не работал ранее с этими протоколами. Почему то я думал что на текущий момент уже есть API более выского уровня, ну например Gmail предлагает свое Api. Но там куча ограничений. Совет хороший.