JPA Criteria API
Выборка записей с максимальной датой в разрезе значений определённого поля На SQL выражение выглядит так (записи с максимальным create_timestamp у каждого sender’а): Но т.к. criteria api поддерживает подзапросы полько в секции where, то можно реализовать только такой запрос (будет делать то же самое): Если реализовать интерфейс Specification, то он будет выглядеть так: При этом, это поля из модели, сгенерированные maven-плагином: Выборка записей с максимальной датой На SQL выражение выглядит так (записи с максимальным create_timestamp): Если реализовать интерфейс Specification, то он будет выглядеть так: Выборка записей с полем, значения которого входят в список значений По аналогии с предыдущими примерами: Выборка записей с полем, значение которого равно указанному значению По аналогии с предыдущими примерами: Выборка записей с полем, значение даты которого равно или более указанной даты Case insensitive like
Открыть файл — предупреждение системы безопасности как отключить
Такая вот ерунда просто вымогает при каждом запуске вполне легитимных приложений: В интернете полно статей как отключить защиту Defender, поправить групповые политики, изменить настройки конфиденциальности, разблокировать приложение… Всё это шляпа. Оказалось, что если запускать непосредственно сам exe-шник, то запускается сразу без этих дурацких вопросов. Значит дело в ярлыке. Но не понятно что с ним не так. Проблему удалось решить случайно, итак: На exe-шнике жмём правой кнопкой — Создать ярлык, вылезет окошко с предложением создать его на рабочем столе — жмём да. Вуаля — этот ярлык нормальный и не задаёт лишних вопросов, можно перемещать его куда вам надо и использовать
Spring data jdbc: one-to-one, one-to-many relations
Т.к. в Spring Data JDBC нет стандартных хибернейтовских аннотаций типа @OneToOne, @OneToMany и @JoinColumn, то для меня было проблематично понять можно ли там вообще организовать отношения и использовать их при получении или сохранении объектов. Оказалось это делается так: One-To-One При такой реализации объект Operation без проблем вычитывается из БД уже с смапленным внутрь TaxInfo. Так же без проблем работает сохранение нового Operation с заполненным TaxInfo (корректно заполняются поля id и operationId. One-To-Many Несколько проблематично отношение один ко многим. Здесь сложность состояла в том, что я использовал List для агрегации нескольких TaxInfo, и при сохранении получал эксепшн ConstraintViolationException. Решение состояло в том, чтобы использовать Set (или Map): При такой реализации объект Operation без проблем вычитывается из БД уже с смапленными внутрь TaxInfo. Так же без проблем работает сохранение нового Operation с заполненными TaxInfo (корректно заполняются поля id и operationId. Теперь про эксепшены. У меня были проблемы именно с аннотацией @MappedCollection в…
Elasticsearch 403
Да, эластиксёрч в россии всё. Но у нас пока есть tor, поэтому можно использовать wget через tor proxy:
Логгирование обращений к базе данных в Spring Boot
Чтобы логгировать SQL-запросы к базе данных — нужно добавить следующие свойства: Ещё есть вариант использовать библиотеку p6spy, которая будет писать в лог настоящие запросы:
Задержка принятия следующего Jms сообщения после ошибки
Вариант реализации JmsListenerContainerFactory (на основе DefaultJmsListenerContainerFactory) для задержки принятия следующего jms сообщения, если был выброшен необработанный эксепшен: Инициализация выглядит следующим образом
9.Транзакционность в JMS
Транзакционность используется для возвращения сообщения обратно в очередь, в случае возникновения исключения при его обработке. Для настройки транзакционности, нужно указать ContainerFactory бину — бин PlatformTransactionManager. Пример настроек JMS: Для того, чтобы rollback сообщения сработал, достаточно чтобы из метода помеченного @JmsListener выбросилось необработанное исключение. Таким образом, исходное сообщение снова появится в очереди и его хэадер JMSXDeliveryCount увеличится на 1. Но здесь есть сайд-эффект, т.к. это сообщение через секунду снова залетит в приложение. Таким образом, если исключение будет постоянно появляться — мы попадём в бесконечный цикл ( есть способ задержки принятия следующего Jms сообщения после ошибки ). По поводу транзакционности, есть пара статуй от IBM: https://community.ibm.com/community/user/integration/blogs/stephanie-wilkerson1/2021/02/25/understanding-mq-backout-queues-thresholds https://www.ibm.com/docs/en/ibm-mq/9.2?topic=applications-handling-poison-messages-in-mq-classes-jms
Кастомная Jackson десериализация/сериализация
Допустим, имеем такую DTO: А нам нужно десериализовать из такого json: То используем над полем аннотацию @JsonDeserialize(using = ProductDtoDeserializer.class) и делаем десериализатор А теперь сделаем так, чтобы строковое поле сериализовывалось в UpperCase
Как настроить ssh при работе (GitLab/GitHub) + SmartGit
GitLab: GitHub: В смартгит можно управлять ключами в Edit -> Properties -> Authentication