Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring JPA и Criteria / 12 сообщений из 12, страница 1 из 1
27.12.2015, 18:06
    #39138875
z3r9
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring JPA и Criteria
Подскажите в Spring JPA можно использовать Criteria? А то смотрю там через Specification, так разве удобно? Расскажите зачем это и как лучше делать сложные запросы.
...
Рейтинг: 0 / 0
27.12.2015, 21:03
    #39138937
Mad_Head
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring JPA и Criteria
Как я понял речь идет о 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
27.12.2015, 21:38
    #39138946
z3r9
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring JPA и Criteria
А как быть с теме что автоматически генерируется? Как в примере нужно создавать 2 репозитория? Как-то не очень удобно получается.
...
Рейтинг: 0 / 0
27.12.2015, 23:13
    #39138973
Mad_Head
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring JPA и Criteria
Вы преувеличиваете. Создавать интерфейс и класс это мелочи по сравнение с тем что нужно написать внутри. Да и вроде как четко отделена кастомная логика, что тоже не плохо
...
Рейтинг: 0 / 0
28.12.2015, 07:25
    #39139021
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring JPA и Criteria
z3r9А как быть с теме что автоматически генерируется? Как в примере нужно создавать 2 репозитория? Как-то не очень удобно получается.

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

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

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

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

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

авторfindAll(criteria.add(Restrictions.eq("test", 1)).add(Restrictions.eq("test2", 2)));
...
Рейтинг: 0 / 0
03.01.2016, 14:14
    #39141578
bochkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring JPA и Criteria
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
03.01.2016, 14:16
    #39141580
bochkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring JPA и Criteria
z3r9mad_nazgul, а без Specification нельзя например в сервисе вызвать типа такого:

авторfindAll(criteria.add(Restrictions.eq("test", 1)).add(Restrictions.eq("test2", 2)));
так не получится
...
Рейтинг: 0 / 0
04.01.2016, 12:32
    #39141914
z3r9
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring JPA и Criteria
bochkov, покажи пожалуйста вызов метода findAll(...); а то не совсем понятно.
...
Рейтинг: 0 / 0
05.01.2016, 14:37
    #39142365
bochkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring JPA и Criteria
Код: 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
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring JPA и Criteria / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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