powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring JPA и Criteria
12 сообщений из 12, страница 1 из 1
Spring JPA и Criteria
    #39138875
z3r9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите в Spring JPA можно использовать Criteria? А то смотрю там через Specification, так разве удобно? Расскажите зачем это и как лучше делать сложные запросы.
...
Рейтинг: 0 / 0
Spring JPA и Criteria
    #39138937
Mad_Head
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как я понял речь идет о spring data jpa.
На мой взгляд criteria api не для сложных запросов, а для динамических (запросов которые меняются в зависимости от условий)
Использовать можно.
https://github.com/spring-projects/spring-data-jpa-examples/tree/master/spring-data-jpa-example/src/main/java/org/springframework/data/jpa/example/repository/custom

А вот для сложных лучше использовать JPQL или native SQL.
...
Рейтинг: 0 / 0
Spring JPA и Criteria
    #39138946
z3r9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как быть с теме что автоматически генерируется? Как в примере нужно создавать 2 репозитория? Как-то не очень удобно получается.
...
Рейтинг: 0 / 0
Spring JPA и Criteria
    #39138973
Mad_Head
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы преувеличиваете. Создавать интерфейс и класс это мелочи по сравнение с тем что нужно написать внутри. Да и вроде как четко отделена кастомная логика, что тоже не плохо
...
Рейтинг: 0 / 0
Spring JPA и Criteria
    #39139021
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
z3r9А как быть с теме что автоматически генерируется? Как в примере нужно создавать 2 репозитория? Как-то не очень удобно получается.

Spring-Data предназначен для CRUD.
Для этого идеально подходит.
Вывести табличку, подредактировать, отфильтровать.

Но если идет сложная БЛ, со сложными выборками (создание новых сущностей), на основе существующих сущностей.
То это не для Spring-Data и JPA.
Тут лучше использовать Spring JdbcTemplate.
...
Рейтинг: 0 / 0
Spring JPA и Criteria
    #39139409
z3r9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mad_nazgul, я не понимаю как Spring data jpa совместить с не стандартным запросом. Как Mad_Head сказал создавать 2 репозитория?
...
Рейтинг: 0 / 0
Spring JPA и Criteria
    #39139435
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
z3r9mad_nazgul, я не понимаю как Spring data jpa совместить с не стандартным запросом. Как Mad_Head сказал создавать 2 репозитория?

В общем случае никак.
А так ч/з Specification.
Только учтите что вам вернется конкретная сущность (Entity) + джоины.
Например, рекурсивный запрос не сделаете.
Ну или новую сущность то же не сделаете.

Т.е. описываете сущность со всякими @OneToMany, @ManyToMany
И по ним можно строить запрос.

Поэтому если что-то "не стандартное", то JdbcTemplate.
Нативный SQL + понятный мапинг на POJO-объект.
...
Рейтинг: 0 / 0
Spring JPA и Criteria
    #39140284
z3r9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mad_nazgul, а без Specification нельзя например в сервисе вызвать типа такого:

авторfindAll(criteria.add(Restrictions.eq("test", 1)).add(Restrictions.eq("test2", 2)));
...
Рейтинг: 0 / 0
Spring JPA и Criteria
    #39141578
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mad_nazgul,
все делается,
я сделал кастомную версию repository SimpleJpaRepository
добавил запросы с LIMIT и придумал так называемую селекцию
пример
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public <P> List<P> findAll(PropertySelection<P> selection, Specification<T> spec, Number limit) {
        return getQueryProperty(selection, spec, null).setMaxResults(limit.intValue()).getResultList();
    }
protected <P> TypedQuery<P> getQueryProperty(PropertySelection<P> sel, Specification<T> spec, Sort sort) {
        CriteriaBuilder builder = em.getCriteriaBuilder();
        CriteriaQuery query = builder.createQuery();
        Root<T> root = applySpecificationToCriteria(spec, query);
        query.select(sel.toSelection(root, query, builder)).distinct(true);
        if (sort != null) {
            query.orderBy(toOrders(sort, root, builder));
        }
        return em.createQuery(query);
    }
public interface PropertySelection<P> {
    Selection<P> toSelection(Root root, CriteriaQuery<?> query, CriteriaBuilder cb);
}
...
Рейтинг: 0 / 0
Spring JPA и Criteria
    #39141580
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
z3r9mad_nazgul, а без Specification нельзя например в сервисе вызвать типа такого:

авторfindAll(criteria.add(Restrictions.eq("test", 1)).add(Restrictions.eq("test2", 2)));
так не получится
...
Рейтинг: 0 / 0
Spring JPA и Criteria
    #39141914
z3r9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bochkov, покажи пожалуйста вызов метода findAll(...); а то не совсем понятно.
...
Рейтинг: 0 / 0
Spring JPA и Criteria
    #39142365
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
    public List<Model> findByMask(final String mask) {
            return repository().findAll(new Specification<Model>() {
                public Predicate toPredicate(Root<Model> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                    return cb.like(root.get("name"),mask);
                }
            }, MAX_MASKED_RESULT);
        
    }
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring JPA и Criteria
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]