leandromoraesrj / sincad-backend

PROJETO BASE DE EXEMPLO USANDO AS MELHORES PRATICAS DE DESENVOLVIMENTO
0 stars 0 forks source link

Mapeamento Hibernate JPA - @QueryMethods, @NativeQuery e @Query #5

Open leandromoraesrj opened 2 years ago

leandromoraesrj commented 2 years ago
leandromoraesrj commented 2 years ago

estab1.setUnidadeEmpresarial(unidade1); estab2.setUnidadeEmpresarial(unidade1); unidade1.setEstabelecimentos(Arrays.asList(estab1, estab2));

unidadeService.save(unidade1); estabService.save(estab1); estabService.save(estab2);


- Para classe mapeada **com 1 para 1** com objeto de domínio, basta executar o **new dominio();** passando o **id**;

TipoUnidadeEstabelecimento tipoUnidade = new TipoUnidadeEstabelecimento(); tipoUnidade.setId(1);

estab1.setTipoUnidadeEstabelecimento(tipoUnidade);


- Para classe mapeada **com 1 para 1** usando **mapsid** (_onde o id dos 2 objetos são os mesmos e os objetos são novos_), basta executar o **save** do objeto principal que o objeto secundário será persistido também;

Estabelecimento estab1 = new Estabelecimento(); Inscricao inscricao1 = new Inscricao();

estab1.setInscricao(inscricao1); inscricao1.setEstabelecimento(estab1);

estabService.adicionarEstabelecimento(estab1);


**@QueryMethods, @NativeQuery e @Query**

@Repository public interface RegimeApuracaoRepository extends JpaRepository<RegimeApuracao, Integer> { // Query Methods Boolean existsByCodigo(Integer id);

Optional findOneByCodigoAndFimIsNull(Integer codigo);

List findDistinctByNomeLikeIgnoreCaseAndFimIsNull(String nome);

List findDistinctByNomeLikeIgnoreCaseOrCodigoOrderByNomeAscCodigoDesc(String nome, Integer codigo);

List findByCodigoInAndFimIsNull(Collection codigos);

findOneBy sempre resulta um getSingleResult(); findBy tem um comportamento diferente dependendo do tipo de retorno;

// Query @Query("select distinct c from RegimeApuracao c where c.fim is null and (upper(c.nome) like upper(:nome) or c.codigo = :codigo) order by c.nome asc, c.codigo desc") List queryDistinctByNomeLikeIgnoreCaseOrCodigoAndFimIsNullOrderByNomeAscCodigoDesc(@Param("nome") String nome, @Param("codigo") Integer codigo);

// QueryNativa @Query(value = "select * from Regime_Apuracao c where c.dt_fim is null and c.no_regime_apuracao like ?1% order by c.no_regime_apuracao asc", nativeQuery = true) List queryNativaByNomeLikeAndFimIsNullOrderByNomeAsc(String nome);

@Transactional @Modifying @Query("delete from RegimeApuracao u where u.nome = ?1") void queryDeleteByName(String nome); }

@Modify só é relevante em combinação com a @Query.

É possível definir os parâmetros com **c.codigo = :codigo** ou **c.codigo = ?1** (_onde ?1 indica a posição do parâmetro_)

Não é possível fazer um @QueryMethods com base em um atributo @Transient:
public class Uf implements Serializable {

@Entity @Table(name = "UF") private static final long serialVersionUID = 1L;

@Id @Column(name = "SG_UF", length = 2) protected String sigla;

@Column(name = "CO_UF_CAD", nullable = false) protected Integer codigoCad;

@Transient protected Integer codigoIbge;

public Integer getCodigoIbge() { return codigoCad; }



Documentação com mais exemplos:
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods