Как добавить динамический где в @Query? - PullRequest
0 голосов
/ 14 декабря 2018

Мне нужно добавить свои условия where в моем фильтрующем объекте.Если какое-либо значение в объекте фильтра является нулевым, необязательно добавьте условие where этого параметра.

Как добавить динамическое где?

Пример:

FilterObject{
  name: "Teste";
  age: null;
}

@Query(value="SELECT id FROM user WHERE name = FilterObject.name", nativeQuery = true)
public List<User> getUsers(???)

Другой пример:

FilterObject{
  name: "Teste";
  age: 12;
}

@Query(value="SELECT id FROM user WHERE name = FilterObject.name AND age = FilterObject.age", nativeQuery = true)
public List<User> getUsers(???)

Это пример высокого уровня.Не правильный код.Но ... Нужно ли понимать мой вопрос

Если параметр моего фильтра равен нулю, этот параметр не используется в моей директории where

Im Использование весенней загрузки с Spring Data JPA и остановка моего запросав моем хранилище хранилище.

Мой оригинальный запрос:

    @Query(value = " SELECT "
        + " solicitacao.nm_orgao AS nmOrgao, "
        + " solicitacao.ds_ano_exercicio AS exercicio, "
        + " solicitacao.nm_organismo AS nmOrganismo, "
        + " dadosBancarios.valor AS valor, "
        + " dadosBancarios.valor * dadosBancarios.vl_taxa_cambio AS valorReais, "
        + " dadosFinanceiros.vl_dotacao_disponivel AS vlDotacaoDisponivel, "
        + " solicitacao.id_solicitacao AS codigoPagamento "
        + " solicitacao.tp_solicitacao_status AS  idFase, "
        + " organismo.id_orgao AS idOrgao, "
        + " solicitacao.id_organismo AS idOrganismo, "
        + " pagamentos.id_status_pagamento AS statusPagamento "
        + " FROM "
        + " tbs_solicitacao solicitacao "
        + " JOIN tbs_dados_bancarios dadosBancarios ON solicitacao.id_solicitacao = dadosBancarios.id_solicitacao "
        + " JOIN tbs_dados_financeiros dadosFinanceiros ON dadosFinanceiros.id_solicitacao = solicitacao.id_solicitacao "
        + " JOIN tbs_organismo organismo ON organismo.id_organismo = solicitacao.id_organismo "
        + " JOIN tbs_pagamentos pagamentos ON dadosFinanceiros.id_dados_financeiros = pagamentos.id_dados_financeiros ",nativeQuery = true)
List<Object[]> getRelatoriosProgramacao();

1 Ответ

0 голосов
/ 14 декабря 2018

Вы можете использовать спецификации Spring Data JPA:

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#specifications

Вам просто нужно реализовать метод toPredicate:

 Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder builder);

В этом методе вы получите root, запрос и CriteriaBuilder для создания API Criteria, где предикат.

Методы событий, такие как findAll, принимают спецификацию.

...