Реализация спецификации spring data jpa данной проблемы

У меня есть стол как

ColA        ColB
Name1       1
Name1       2
Name2       1
Name2       3
Name2       5

Я хочу получить свой набор результатов как

ColA        ColB
Name1       1
Name2       1

Как мы можем реализовать это в спецификации Spring Data JPA?

Почему ColB означает в вашем ожидаемом результате?

sp00m 10.09.2018 11:40

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

Kamil W 10.09.2018 11:42

Мне не нужно передавать в него какие-либо ценности. Я просто хочу напечатать минимальное значение ColB, соответствующее имени. Пример: Name1 имеет минимальное значение 1, Name2 имеет минимальное значение 1

deepak asai 10.09.2018 11:49

да функция min в наличии в спецификации

Narayan Yerrabachu 10.09.2018 13:40

В Spring Data JPA невозможно использовать спецификацию для достижения того, что вы хотите, потому что спецификация влияет только на предложение WHERE оператора SQL, тогда как вам нужны функциональные возможности SQL GROUB BY и MIN.

Robert Niestroj 10.09.2018 15:11

@Robert Niestroj: Нет, это возможно с Spring Data JPA с использованием спецификации. Мы также можем изменить выбор, используя Спецификацию Ex: -query.select (cb.min (root.get (column.getName ())));

Narayan Yerrabachu 12.09.2018 07:29

Параметр «Группировать по» доступен в спецификации query.group By (cb).

Narayan Yerrabachu 12.09.2018 07:36

javax.persistence.criteria.CriteriaQuery <User> проверьте этот интерфейс, вы найдете функции и предложения

Narayan Yerrabachu 12.09.2018 08:16
2
8
2 325
1

Ответы 1

Добавьте приведенный ниже код в интерфейс вашего репозитория. Я думаю, это должно сработать.

    @Async
   @Query(value = "select * " +
                " from TableA ta " +
                "where ta.colb = :colb",nativeQuery=true)
    List<T> findByColA(@Param("colb") String colb);

или

со спецификацией

Создать объект спецификации:

Функции критериев (SUM, MAX или MIN) для спецификации:

javax.persistence.criteria.CriteriaQuery<T> Проверьте этот интерфейс, чтобы найти дополнительную информацию.

    final class UserSpecifications {

        private UserSpecifications() {}

        static Specification<User> findData(String colb, String columnName) {
                  return new Specification<User>() {
                public Predicate toPredicate(Root<User> root,                                 
                                    CriteriaQuery<?> query, 
                                    CriteriaBuilder cb) {
                     root = query.from(User.class);
                     Predicate colbp = cb.equal(root.get(columnName), colb);
                     Expression<String> groupByExp = root.get(columnname).as(String.class);
                     query.where(colbp);
                     query.select(cb.min(root.get(column.getName())));
                     query.groupBy(groupByExp);                         
                }
            }
       }
    }

    Specification<User> spec = UserSpecifications.findData("1", "columnName");

    List<User> allUsers = repository.findAll(spec);

Учебник: Учебник по данным Spring

пример спецификации: Спецификация Spring Data

Пример спецификации пружины: Руководство по спецификации пружин

Ссылка на стек: Спецификация пружины

Я хочу использовать со спецификацией. Чтобы я мог передать findAll (спецификация)

deepak asai 10.09.2018 12:03

да, вы также можете сделать это со спецификацией List <T> findAll (Specification <T> spec);

Narayan Yerrabachu 10.09.2018 12:06

Я сомневаюсь, как создать этот объект спецификации.

deepak asai 10.09.2018 12:16

Я отправил ссылку, там вы найдете пример

Narayan Yerrabachu 10.09.2018 12:36

Спецификация пользователя spec1 = новая спецификация пользователя (новые критерии поиска ("возраст", ">", "25")); Спецификация пользователя spec2 = новая спецификация пользователя (новые критерии поиска ("lastName", ":", "doe")); Список <User> results = repository.findAll (Specifications.where (spec1) .and (spec2));

Narayan Yerrabachu 10.09.2018 12:36

Создайте новый объект Specification <T>. Надеюсь, эта информация вам поможет

Narayan Yerrabachu 10.09.2018 12:42

Следуйте этому примеру: leaks.wanari.com/2018/01/23/awesome-spring-specification

Narayan Yerrabachu 10.09.2018 12:48

Я сомневаюсь в том, как реализовать функции Max и min и данные Spring JPA. Поскольку я так не думаю, что легко построить объект спецификации для моей проблемы. Могут ли некоторые четко построить объект спецификации для моей проблемы?

deepak asai 10.09.2018 13:07

Пример stackoverflow.com/questions/38934549/… для функции суммы, вероятно, он также работает для функций max и min. Просто попробуйте. Надеюсь, это сработает

Narayan Yerrabachu 10.09.2018 13:25

query.select (conditionsBuilder.min (root.get (column.getName ())) ‌); вы должны включить этот оператор в свой объект спецификации

Narayan Yerrabachu 10.09.2018 13:43

функции критериев (сумма, макс. или мин.) доступны в спецификации пружины.

Narayan Yerrabachu 10.09.2018 14:44

Этот ответ должен был быть принятым. Он хорошо сформулирован, с отличными ссылками. Ответ и комментарии @NarayanYerrabachu очень помогли мне в сложном запросе, над которым мы работаем, со многими объединениями и специальными критериями.

user1567291 15.05.2019 16:41

Другие вопросы по теме