簡體   English   中英

如何使用Spring Data JPA實現對可選字段的搜索?

[英]How to implement a search for optional fields using Spring data JPA?

如何使用Spring Data JPA實現對可選字段的搜索? 我已經在多個地方進行了研究,但沒有任何幫助。

經過一段時間的反復試驗,我得以實現對可選字段的搜索。

1)我使用JpaSpecificationExecutor接口擴展了我的存儲庫

package br.mp.mpce.sge.repository;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;

import br.mp.mpce.sge.domain.Documento;
import br.mp.mpce.sge.domain.Setor;

@Repository
public interface DocumentoRepository extends JpaRepository<Documento, Integer>, JpaSpecificationExecutor<Documento> {

    Page<Documento> findPageBySetorCadastro(Setor setor, Pageable pageRequest);

}

2)我實現了根據我的搜索參數返回“規格”的方法。

package br.mp.mpce.sge.specifications;

import java.time.LocalDateTime;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import org.springframework.data.jpa.domain.Specification;

import br.mp.mpce.sge.domain.Documento;
import br.mp.mpce.sge.domain.Setor;

public final class DocumentoSpecification {

    public static Specification<Documento> byCodigo(Integer codigo) {
        return new Specification<Documento>() {

            private static final long serialVersionUID = -4943925466558950754L;

            @Override
            public Predicate toPredicate(Root<Documento> root, CriteriaQuery<?> query,
                    CriteriaBuilder criteriaBuilder) {
                return criteriaBuilder.equal(root.get("codigo"), codigo);
            }

        };
    }

    public static Specification<Documento> byAno(String ano) {
        return new Specification<Documento>() {

            private static final long serialVersionUID = 8333055743400529192L;

            @Override
            public Predicate toPredicate(Root<Documento> root, CriteriaQuery<?> query,
                    CriteriaBuilder criteriaBuilder) {
                return criteriaBuilder.equal(root.get("ano"), ano);
            }

        };
    }

    public static Specification<Documento> byDataInicial(LocalDateTime dataInicial) {
        return new Specification<Documento>() {

            private static final long serialVersionUID = -9172458840598392417L;

            @Override
            public Predicate toPredicate(Root<Documento> root, CriteriaQuery<?> query,
                    CriteriaBuilder criteriaBuilder) {
                return criteriaBuilder.greaterThanOrEqualTo(root.get("dataCadastro"), dataInicial);
            }

        };
    }

    public static Specification<Documento> byDataFinal(LocalDateTime dataFinal) {
        return new Specification<Documento>() {

            private static final long serialVersionUID = 1422089735211883866L;

            @Override
            public Predicate toPredicate(Root<Documento> root, CriteriaQuery<?> query,
                    CriteriaBuilder criteriaBuilder) {
                return criteriaBuilder.lessThanOrEqualTo(root.get("dataCadastro"), dataFinal);
            }

        };
    }

    public static Specification<Documento> bySetor(Setor setor) {
        return new Specification<Documento>() {

            private static final long serialVersionUID = -2336742358257555013L;

            @Override
            public Predicate toPredicate(Root<Documento> root, CriteriaQuery<?> query,
                    CriteriaBuilder criteriaBuilder) {
                return criteriaBuilder.equal(root.get("setorCadastro"), setor);
            }

        };
    }
}

3º)我實施了服務等級方法。

public Page<Documento> findByFields(Integer codigo, String ano, String dataInicio, String dataFinal, Integer page,
            Integer lines, String direction, String orderBy) {
        UsuarioSS usuarioSS = UsuarioServiceImpl.authenticated();
        if (usuarioSS == null) {
            throw new PersonalizedAutorizationException("Acesso negado - Usuario deve estar autenticado");
        }

        Usuario usuario = usuarioService.findById(usuarioSS.getId());
        PageRequest pageRequest = PageRequest.of(page, lines, Direction.fromString(direction), orderBy);

        Specification<Documento> specification = DocumentoSpecification.bySetor(usuario.getSetor());

        if (codigo != null) {
            specification = specification.and(DocumentoSpecification.byCodigo(codigo));
        }

        if (ano != null) {
            specification = specification.and(DocumentoSpecification.byAno(ano));
        }
        if (dataInicio != null) {
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
            LocalDate localDateInicio;
            localDateInicio = LocalDate.parse(dataInicio, formatter);
            LocalDateTime localDateTimeInicio = localDateInicio.atStartOfDay();
            specification = specification.and(DocumentoSpecification.byDataInicial(localDateTimeInicio));
        }
        if (dataFinal != null) {
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
            LocalDate localDateFinal;
            localDateFinal = LocalDate.parse(dataFinal, formatter);
            LocalDateTime localDateTimeFinal = localDateFinal.atStartOfDay();
            specification = specification.and(DocumentoSpecification.byDataFinal(localDateTimeFinal));
        }

        Page<Documento> pageDoc = documentoRepository.findAll(specification, pageRequest);

        if (pageDoc.getContent().isEmpty()) {
            throw new PersonalizedObjectNotFoundException(super.messageSource.getMessage("error.notFound",
                    new String[] { super.messageSource.getMessage(
                            StringUtils.uncapitalize(super.getEntityClass().getSimpleName()), null,
                            StringUtils.uncapitalize(getEntityClass().getSimpleName()), null) },
                    "error.notFound", null));
        }

        return pageDoc;

    }

4º)在restcontroller中實現了搜索方法。

@RequestMapping(value = "/search", method = RequestMethod.GET)
    public ResponseEntity<Page<Documento>> findPageByFields(
            @RequestParam(value = "codigo", required = false) Integer codigo,
            @RequestParam(value = "ano", required = false) String ano,
            @RequestParam(value = "dataInicio", required = false) String dataInicio,
            @RequestParam(value = "dataFinal", required = false) String dataFinal,
            @RequestParam(value = "page", defaultValue = "0") Integer page,
            @RequestParam(value = "lines", defaultValue = "10") Integer lines,
            @RequestParam(value = "direction", defaultValue = "DESC") String direction,
            @RequestParam(value = "orderBy", defaultValue = "dataCadastro") String orderBy) {
        Page<Documento> pageDocumento = documentoService.findByFields(codigo, ano, dataInicio, dataFinal, page, lines,
                direction, orderBy);
        return ResponseEntity.ok().body(pageDocumento);
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM