[JAVA] Exemple de code pour la recherche à l'aide de QBE (requête par exemple) de Spring Data JPA

Aperçu

QBE (Query by Example: "Inquiry by example") est l'un des langages d'interrogation, et l'explication de wikipedia est citée ci-dessous.

[Demandes par exemple](https://ja.wikipedia.org/wiki/%E4%BE%8B%E7%A4%BA%E3%81%AB%E3%82%88%E3%82%8B% E5% 95% 8F% E3% 81% 84% E5% 90% 88% E3% 82% 8F% E3% 81% 9B) C'est l'un des langages d'interrogation des bases de données relationnelles. QBE a été inventé par Moshe Zroof en parallèle du développement d'un autre langage de requête SQL au IBM Research Center de Yorktown, New York, USA au milieu des années 1970. QBE est le premier langage d'enquête visuelle.

Spring Data JPA est pris en charge depuis la version 1.10, j'ai donc écrit un exemple de code pour un processus de recherche simple.

environnement

référence

Rechercher par QBE

Pour vous renseigner auprès de QBE, utilisez l'exemple de Spring Data JPA (l'exemple est associé à un exemple de code, mais il s'agit d'une classe appelée org.springframework.data.domain.Example) et ExampleMatcher. J'utilise également une interface appelée QueryByExampleExecutor, mais JpaRepository Puisqu'il en hérite, si vous utilisez le référentiel Jpa, vous n'avez pas besoin d'en être à nouveau conscient dans l'implémentation.

Exemple de code

Vous trouverez ci-dessous un exemple de code simple à rechercher avec QBE. QBE vous permet d'écrire un processus de recherche simple de manière concise, mais j'ai estimé qu'il ne convenait pas à une recherche avec des conditions compliquées.

entité

Entité d'élément utilisée dans l'exemple de code de recherche QBE.

@Entity
@Table(name="item")
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ToString(exclude = {"itemStocks"})
@EqualsAndHashCode(exclude = {"itemStocks"})
public class Item implements Serializable {

    private static final long serialVersionUID = -3153084093423004609L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name="name", nullable = false)
    private String name;
    @Column(name="price", nullable = false)
    private Integer price;
    @Column(name="sales_from", nullable = false)
    private LocalDateTime salesFrom;
    @Column(name="sales_to", nullable = false)
    private LocalDateTime salesTo;
    @Enumerated(EnumType.ORDINAL)
    @Column(name="standard_type", nullable = false)
    private StandardType standardType;
    @JoinColumn(name = "category_id", nullable = false)
    @ManyToOne
    private Category category;
    @Column(name="del_flag", nullable = false)
    private Boolean delFlag;
    @Column(name="create_at", nullable = false)
    private LocalDateTime createAt;
    @Column(name="update_at", nullable = false)
    private LocalDateTime updateAt;

    @OneToMany(mappedBy = "item", cascade = CascadeType.ALL)
    private List<ItemStock> itemStocks;
}

Dépôt

Référentiel d'articles. En particulier, nous n'avons pas implémenté de méthodes personnalisées pour QBE. Puisque JpaRepository hérite de QueryByExampleExecutor, vous pouvez effectuer une recherche avec QBE tel quel.

import com.example.domain.entity.Item;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ItemRepository extends JpaRepository<Item, Long> { }

En passant, les méthodes définies dans l'interface QueryByExampleExecutor sont findOne, findAll, count, exists.

Example

La recherche la plus simple consiste à exprimer les critères de recherche en tant qu'entité, à l'utiliser pour créer une instance Example et à la transmettre à la méthode de recherche dans le référentiel.

Cet exemple recherche des données avec un prix de 1000 et un type standard de D. Si la propriété de l'entité est définie sur une valeur autre que null, elle sera utilisée comme condition de recherche.

@Autowired
private ItemRepository repository;

public void find() {

  //Définir les critères de recherche sur l'entité
  Item probe = new Item();
  probe.setPrice(1000);
  probe.setStandardType(StandardType.D);

  //Générer une instance d'exemple à partir de critères de recherche
  Example<Item> example = Example.of(probe);

  List<Item> items = repository.findAll(example);
  items.forEach(System.out::println);
}

ExampleMatcher

Si vous souhaitez effectuer une recherche avec des conditions plus complexes, utilisez Example Matcher pour créer les conditions de recherche.

matching / matchingAll

Méthode statique qui crée un ExampleMatcher qui recherche des données correspondant à toutes les propriétés spécifiées dans les critères de recherche. La correspondance est appelée en interne par ExampleMatcher # matchingAll.

Cet exemple recherche les données dont le nom commence par "cuisine" et dont le prix est 800. La condition de recherche pour la propriété name est assemblée avec ExampleMatcher.

Item item = new Item();
item.setName("kitchen");
item.setPrice(800);

ExampleMatcher matcher = ExampleMatcher.matching()
    .withMatcher("name", match -> match.ignoreCase().startsWith());

Example<Item> example = Example.of(item, matcher);

List<Item> items = repository.findAll(example);
items.forEach(System.out::println);

matchingAny

Méthode statique qui génère un ExampleMatcher qui recherche des données qui correspondent à une ou plusieurs des propriétés spécifiées dans les critères de recherche.

Cet exemple recherche les données dont le nom commence par "cuisine" ou dont le prix est 800, que le nom soit supérieur ou inférieur.

Item item = new Item();
item.setName("kitchen");
item.setPrice(800);

ExampleMatcher matcher = ExampleMatcher.matchingAny()
    .withMatcher("name", match -> match.ignoreCase().startsWith());

Example<Item> example = Example.of(probe, matcher);

List<Item> items = repository.findAll(example);
items.forEach(System.out::println);

withIgnorePaths

Si la propriété de l'entité utilisée pour la recherche est différente de null, elle sera traitée comme une condition de recherche. Si vous ne souhaitez pas utiliser une propriété spécifique comme condition de recherche, vous pouvez l'exclure en spécifiant le nom de la propriété avec withIgnorePaths.

Cet exemple exclut les propriétés id, price et standardType des critères de recherche.

ExampleMatcher matcher = ExampleMatcher.matchingAny()
    .withMatcher("name", match -> match.ignoreCase().startsWith())
    .withIgnorePaths("id", "price", "standardType");

withIncludeNullValues

Si vous souhaitez effectuer une recherche même si elle est nulle, utilisez withIncludeNullValues. Cependant, veuillez noter que si vous ne restreignez pas les propriétés cibles en utilisant withIgnorePaths ci-dessus, il sera appliqué à toutes les propriétés. L'instruction SQL ajoute la condition «le nom de la colonne est nul» à la colonne correspondante.

ExampleMatcher matcher = ExampleMatcher.matchingAny()
    .withMatcher("name", match -> match.ignoreCase().startsWith())
    .withIncludeNullValues();

Recommended Posts

Exemple de code pour la recherche à l'aide de QBE (requête par exemple) de Spring Data JPA
Exemple de code pour le contrôle de la base de données par transaction déclarative avec Spring Boot + Spring Data JPA
Spring Data JPA: écrivez une requête en Pure SQL dans @Query of Repository
Aucune liste de propriétés trouvée pour le type car il s'agit d'une requête non nommée de Spring Data JPA
Exemple de code pour l'implémentation Singleton à l'aide d'énumération
OU rechercher avec la spécification Spring Data Jpa
Existe en utilisant la spécification dans Spring Data JPA
Trier par Spring Data JPA (avec tri par clé composée)
J'ai besoin de la validation de Spring Data pour Pageable ~
Vérifiez le comportement de getOne, findById et des méthodes de requête avec Spring Boot + Spring Data JPA
Jusqu'à l'utilisation de Spring Data et JPA Part 1
Exemple de code pour la sortie du journal par Java + SLF4J + Logback
Exemple d'utilisation de vue.config.js
[Enum] Utilisez des rails enum pour améliorer la lisibilité des données