A consulta existe nos dados do Spring

A consulta existe nos dados do Spring

1. Introdução

Em muitos aplicativos centrados em dados, pode haver situações em que precisamos verificar se um objeto específico já existe.

Neste tutorial, discutiremos várias maneiras de conseguir exatamente isso usando Spring Data e JPA.

2. Entidade de amostra

Para preparar o terreno para nossos exemplos, vamos criar uma entidadeCar com duas propriedades,model andpower:

@Entity
public class Car {

    @Id
    @GeneratedValue
    private int id;

    private Integer power;
    private String model;

    // getters, setters, ...
}

3. Pesquisando por ID

A interfaceJpaRepository expõe o métodoexistsById que verifica se uma entidade com oid fornecido existe no banco de dados:

int searchId = 2; // ID of the Car
boolean exists = repository.existsById(searchId)

Vamos supor quesearchId é oid de aCar que criamos durante a configuração do teste. Para fins de repetibilidade do teste, nunca devemos usar um número embutido em código (por exemplo, “2”) porque a propriedadeid deCar é provavelmente gerada automaticamente e pode mudar com o tempo. The existsById query is the easiest but least flexible way of checking for an object’s existence.

4. Usando um método de consulta derivada

Também podemos usar o recurso de método de consulta derivado do Spring para formular nossa consulta. Em nosso exemplo, queremos verificar se existe umCar com um determinado nome de modelo, portanto, planejamos o seguinte método de consulta:

boolean existsCarByModel(String model);

It’s important to note that the naming of the method is not arbitrary — it must follow certain rules. O Spring gerará o proxy para o repositório, de modo que possa derivar a consulta SQL do nome do método. IDEs modernos como o IntelliJ IDEA fornecerão a conclusão da sintaxe para isso.

Quando as consultas ficam mais complexas - por exemplo, incorporando ordenação, resultados limitantes e vários critérios de consulta - these method names can get quite long, right up to the point of illegibility. Além disso, os métodos de consulta derivados podem parecer mágicos por causa de sua natureza implícita e "por convenção".

No entanto, eles podem ser úteis quando o código limpo e organizado é importante e quando os desenvolvedores desejam confiar em uma estrutura bem testada.

5. Pesquisando porExample

UmExample é uma maneira muito poderosa de verificar a existência porque usaExampleMatchers para construir dinamicamente a consulta. Portanto, sempre que exigimos dinamicidade, é uma boa maneira de fazê-lo. Uma explicação abrangente sobre SpringExampleMatchers e como usá-los pode ser encontrada em nosso artigoSpring Data Query.

5.1. O Matcher

Suponha que desejamos procurar nomes de modelos de maneira que não diferencie maiúsculas de minúsculas. Vamos começar criando nossoExampleMatcher:

ExampleMatcher modelMatcher = ExampleMatcher.matching()
  .withIgnorePaths("id")
  .withMatcher("model", ignoreCase());

Observe que devemos ignorar explicitamente o caminhoid porqueid  é a chave primária e essas são obtidas automaticamente por padrão.

5.2. A sonda

Em seguida, precisamos definir o chamado "probe", que é uma instância da classe que queremos procurar. Tem todas as propriedades relevantes para a pesquisa definidas. Em seguida, o conectamos ao nossonameMatchere executamos a consulta:

Car probe = new Car();
probe.setModel("bmw");
Example example = Example.of(probe, modelMatcher);
boolean exists = repository.exists(example);

Com grande flexibilidade vem grande complexidade e, por mais poderosa que seja a APIExampleMatcher, usá-la produzirá algumas linhas de código extra. Sugerimosusing this in dynamic queries or if no other method fits the need.

6. Escrevendo uma consulta JPQL personalizada com semântica existente

O último método que examinaremos usa JPQL (Java Persistence Query Language) para implementar uma consulta personalizada com a semântica existente:

@Query("select case when count(c)> 0 then true else false end from Car c where lower(c.model) like lower(:model)")
boolean existsCarLikeCustomQuery(@Param("model") String model);

A ideia éexecute a case-insensitive count query based on the model property, evaluate the return value, and map the result to a Java*boolean*. Novamente, a maioria dos IDEs tem um suporte muito bom para instruções JPQL.

Custom JPQL queries pode ser visto como uma alternativa aos métodos derivados e muitas vezes são uma boa escolha quando estamos confortáveis ​​com instruções semelhantes a SQL e não nos importamos com as anotações@Query adicionais.

7. Conclusão

Neste tutorial, vimos como verificar se existe um objeto em um banco de dados usando Spring Data e JPA. Não existe uma regra rígida e rápida de quando usar qual método, porque dependerá muito do caso de uso em questão e da preferência pessoal.

Como regra geral, no entanto, com uma opção, os desenvolvedores devem sempre adotar o método mais direto por razões de robustez, desempenho e clareza de código. Além disso, uma vez decidido sobre consultas derivadas ou consultas JPQL personalizadas, é uma boa ideia manter essa escolha o máximo possível para garantir um estilo de codificação consistente.

Um exemplo de código-fonte completo pode ser encontrado emGithub.