Skip to content

Построение запроса в аннотации Query #3

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
VladislavK777 opened this issue Jul 10, 2022 · 4 comments
Open
Assignees
Labels
enhancement New feature or request

Comments

@VladislavK777
Copy link

Было бы здорово сделать возможным писать запросы используя JPQL.
@query("from TaskView t where t.name = 'Task_2')

@evgeniycheban evgeniycheban added the enhancement New feature or request label Jan 15, 2025
@VladislavK777
Copy link
Author

проверил кейс с новым релизом 1.4. Запрос с аннотацией @query отрабатывает корректно

@evgeniycheban
Copy link
Owner

проверил кейс с новым релизом 1.4. Запрос с аннотацией @query отрабатывает корректно

Так же теперь можно использовать SpEL выражения в запросах, например чтобы передавать объект с параметрами целиком и обращаться к нужным полям в запросе, пример:

@Query("SELECT * FROM items WHERE id = :#{#item.id} AND name = :#{#item.name} AND value = :#{#item.value}")
Optional<TestItem> findOneItem(TestItem item);

Я постараюсь сегодня-завтра обновить readme, и добавить туда побольше примеров, пока что можно посмотреть примеры использования в тестах.

@VladislavK777
Copy link
Author

забыл проверить, Speсification поддерживается?

@evgeniycheban
Copy link
Owner

evgeniycheban commented Apr 10, 2025

забыл проверить, Speсification поддерживается?

Сам по себе Specification является частью JPA, а Reindexer это все же NoSQL решение поэтому стандарт JPA не реализуется напрямую, но есть что-то похожее в виде Query By Example, пример использования:

TestItem testItem = new TestItem();
testItem.setValue("Test");
List<TestItem> foundItems = this.repository.findAll(Example.of(testItem, ExampleMatcher.matching()
	.withMatcher("value", ExampleMatcher.GenericPropertyMatcher.of(ExampleMatcher.StringMatcher.STARTING))));

Объект Example принимает сущность того же типа что указан в репозитории, и строит запрос используя поля этого объекта, в примере выше это: найти все записи Item у которых поле value начинается с "Test", по умолчанию производится поиск с полным сравнением (equals) полей, есть возможность использовать MathMode.ALL для построения AND запросов и MathMode.ANY для построения OR запросов, так же поддерживается поиск без учета регистра строк.
Можно посмотреть более детально в официальной документации Spring Data.

Отдельно отмечу, что условия по полям вложенных объектов так же поддерживаются, для того чтобы переопределить значение поля вложенного объекта в ExampleMatcher нужно передать путь к полю в формате "x.y.z", например если в объекте TestItem есть поле которое является типом TestNestedItem в котором мы хотим сделать условие, что значение поля name заканчивается на "Value", то ExampleMatcher будет выглядеть следующим образом:

TestItem testItem = new TestItem();
testItem.setValue("Test");
TestNestedItem nestedItem = new TestNestedItem();
nestedItem.setName("Value");
testItem.setNestedItem(nestedItem);
List<TestItem> foundItems = this.repository.findAll(Example.of(testItem, ExampleMatcher.matching()
	.withMatcher("nestedItem.name", ExampleMatcher.GenericPropertyMatcher.of(StringMatcher.ENDING))
	.withMatcher("value", ExampleMatcher.GenericPropertyMatcher.of(ExampleMatcher.StringMatcher.STARTING))));

Если нужно более гибкое управление созданием запроса, то в ReindexerRepository есть метод query() возвращающий ru.rt.restream.reindexer.Query из Java-коннектора, в планах есть создание еще одной абстракции над этим объектом чтобы сделать его более похожим на Specification api.

@evgeniycheban evgeniycheban self-assigned this Apr 11, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants