Как передать собственный запрос со слоя службы на слой репозитория в SpringBoot CrudRepository

У меня есть приложение SpringBoot. Его репозиторий использует CrudRepository.

i am trying to pass a native query from my Service layer to Repository layer. So how can i do this ? I know there is @Query annotation. but i want to know how to pass native query from my Service layer to Repository layer? If not possible can you tell me how to write below query in @Query annotations

Метод сервисного уровня

public List<Application> search(Application app) {
    List<Application> list = new ArrayList<>();
    StringBuilder sb = new StringBuilder();
    sb.append("SELECT * FROM applications WHRERE is_delete = 0 ");
    try {
        if (app.getFirst_name().trim().length() > 0 && app.getFirst_name() != null) {
            sb.append("AND first_name = '" + app.getFirst_name() + "'");
        }

        if (app.getLast_name().trim().length() > 0 && app.getLast_name() != null) {
            sb.append("AND last_name = '" + app.getLast_name() + "'");
        }

        if (app.getEmail().trim().length() > 0 && app.getEmail() != null) {
            sb.append("AND email = '" + app.getEmail() + "'");
        }

        if (app.getPhone().trim().length() > 0 && app.getPhone() != null) {
            sb.append("AND phone = '" + app.getPhone() + "'");
        }

        if (app.getStatus()+"".length() > 0) {
            sb.append("AND status = '" + app.getStatus() + "'");
        }

        //Here i am preparing search query
        String query = sb.toString();
        list = (List<Application>) applicationDao.search(query);

    } catch (Exception e) {
        e.printStackTrace();
    }

    return list;
}

IApplicationDao

package com.Mortgage.MortgageLoanAPI.dao;

import java.util.List;

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;

import com.Mortgage.MortgageLoanAPI.models.Application;

public interface IApplicationDao extends CrudRepository<Application, Long>{

    List<Application> search(String query);
}

Вы уверены, что пытаетесь сделать что-то хорошее? Я думаю, вам лучше передать параметры в запрос, а не полный запрос

Pijotrek 01.03.2019 11:57

@Pijotrek можно ли передать полный запрос?

Sangram Badi 01.03.2019 11:59

Честно говоря, я не знаю, но ваше решение не кажется мне слишком чистым. Я думаю, вам следует взглянуть на: baeldung.com/spring-data-criteria-queries и добавить Criterias вместо добавления ANDs к StringBuilder

Pijotrek 01.03.2019 12:17

Хорошо, не могли бы вы рассказать мне, как написать вышеуказанный запрос в аннотациях @Query @Pijotrek

Sangram Badi 01.03.2019 12:20
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
1 082
1

Ответы 1

Вы можете попробовать спецификацию весенних данных. ниже пример. для получения более подробной информации см. https://dzone.com/articles/using-spring-data-jpa-спецификация

public class UserSpecification implements Specification<User> {

    private SearchCriteria criteria;

    @Override
    public Predicate toPredicate
      (Root<User> root, CriteriaQuery<?> query, CriteriaBuilder builder) {

        if (criteria.getOperation().equalsIgnoreCase(">")) {
            return builder.greaterThanOrEqualTo(
              root.<String> get(criteria.getKey()), criteria.getValue().toString());
        } 
        else if (criteria.getOperation().equalsIgnoreCase("<")) {
            return builder.lessThanOrEqualTo(
              root.<String> get(criteria.getKey()), criteria.getValue().toString());
        } 
        else if (criteria.getOperation().equalsIgnoreCase(":")) {
            if (root.get(criteria.getKey()).getJavaType() == String.class) {
                return builder.like(
                  root.<String>get(criteria.getKey()), "%" + criteria.getValue() + "%");
            } else {
                return builder.equal(root.get(criteria.getKey()), criteria.getValue());
            }
        }
        return null;
    }
}

Но я не хочу использовать какой-либо другой, потому что мы уже разработали это приложение с crud-репозиторием. Если мы перейдем к другим, то это будет большая задача.

Sangram Badi 01.03.2019 12:33

Так ли это возможно с репозиторием Crud. Если нет, то как я могу использовать аннотации @Query

Sangram Badi 01.03.2019 12:34

Spring data jpa предоставляет CRUDRepository, а также предоставляет спецификацию. Это один из способов разработки кода. вы также можете использовать собственный репозиторий, например: dzone.com/articles/…

user4477122 01.03.2019 12:35

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