[JAVA] Beispielcode für die Suche mit QBE (Query by Example) von Spring Data JPA

Überblick

QBE (Abfrage nach Beispiel: "Anfrage nach Beispiel") ist eine der Abfragesprachen, und die Erklärung von Wikipedia wird unten zitiert.

[Anfragen anhand eines Beispiels](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) Es ist eine der Abfragesprachen für relationale Datenbanken. QBE wurde von Moshe Zroof parallel zur Entwicklung einer weiteren Abfragesprache SQL im IBM Research Center in Yorktown, New York, USA, Mitte der 1970er Jahre erfunden. QBE ist die erste visuelle Anfragesprache.

Spring Data JPA wird seit Version 1.10 unterstützt, daher habe ich einen Beispielcode für einen einfachen Suchvorgang geschrieben.

Umgebung

Referenz

Nach QBE suchen

Verwenden Sie zum Abfragen mit QBE das Beispiel von Spring Data JPA (Beispiel ist mit Beispielcode verknüpft, es handelt sich jedoch um eine Klasse mit dem Namen org.springframework.data.domain.Example) und ExampleMatcher. Ich verwende auch eine Schnittstelle namens QueryByExampleExecutor, aber JpaRepository Wenn Sie das Jpa-Repository verwenden, müssen Sie es in der Implementierung nicht erneut kennen, da es dies erbt.

Beispielcode

Unten finden Sie einen einfachen, aber beispielhaften Code für die Suche mit QBE. Mit QBE können Sie einen einfachen Suchvorgang präzise schreiben, aber ich war der Meinung, dass er nicht für die Suche unter komplizierten Bedingungen geeignet ist.

Entität

Elemententität, die im QBE-Suchbeispielcode verwendet wird.

@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;
}

Repository

Item Repository. Insbesondere haben wir keine benutzerdefinierten Methoden für QBE implementiert. Da JpaRepository QueryByExampleExecutor erbt, können Sie mit QBE so wie es ist suchen.

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

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

Übrigens sind die in der QueryByExampleExecutor-Schnittstelle definierten Methoden findOne, findAll, count, exist.

Example

Die einfachste Suche besteht darin, die Suchkriterien als Entität auszudrücken, eine Beispielinstanz zu erstellen und sie an die Suchmethode im Repository zu übergeben.

Dieses Beispiel sucht nach Daten mit einem Preis von 1000 und einem Standardtyp von D. Wenn die Eigenschaft der Entität auf einen anderen Wert als null festgelegt ist, wird sie als Suchbedingung verwendet.

@Autowired
private ItemRepository repository;

public void find() {

  //Setzen Sie die Suchkriterien auf Entität
  Item probe = new Item();
  probe.setPrice(1000);
  probe.setStandardType(StandardType.D);

  //Beispielinstanz aus Suchkriterien generieren
  Example<Item> example = Example.of(probe);

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

ExampleMatcher

Wenn Sie mit komplizierteren Bedingungen suchen möchten, verwenden Sie Example Matcher, um die Suchbedingungen zu erstellen.

matching / matchingAll

Eine statische Methode, die einen ExampleMatcher erstellt, der nach Daten sucht, die allen in den Suchkriterien angegebenen Eigenschaften entsprechen. Matching wird intern von ExampleMatcher # matchAll aufgerufen.

In diesem Beispiel wird nach Daten gesucht, deren Name mit "Küche" beginnt und deren Preis 800 beträgt. Die Suchbedingung für die Eigenschaft name wird mit ExampleMatcher zusammengestellt.

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

Eine statische Methode, die einen ExampleMatcher generiert, der nach Daten sucht, die einer oder mehreren der in den Suchkriterien angegebenen Eigenschaften entsprechen.

In diesem Beispiel wird nach Daten gesucht, deren Name mit "Küche" beginnt oder deren Preis 800 beträgt, unabhängig davon, ob der Name oben oder unten ist.

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

Wenn die Eigenschaft der für die Suche verwendeten Entität nicht null ist, wird sie als Suchbedingung behandelt. Wenn Sie eine bestimmte Eigenschaft nicht als Suchbedingung verwenden möchten, können Sie sie ausschließen, indem Sie den Eigenschaftsnamen mit withIgnorePaths angeben.

In diesem Beispiel werden die Eigenschaften id, price und standardType von den Suchkriterien ausgeschlossen.

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

withIncludeNullValues

Wenn Sie suchen möchten, auch wenn es null ist, verwenden Sie withIncludeNullValues. Beachten Sie jedoch, dass wenn Sie die Zieleigenschaften nicht mithilfe von withIgnorePaths oben eingrenzen, sie auf alle Eigenschaften angewendet werden. Die SQL-Anweisung fügt der entsprechenden Spalte die Bedingung "Spaltenname ist null" hinzu.

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

Recommended Posts

Beispielcode für die Suche mit QBE (Query by Example) von Spring Data JPA
Beispielcode für die DB-Steuerung durch deklarative Transaktion mit Spring Boot + Spring Data JPA
Spring Data JPA: Schreiben Sie eine Abfrage in Pure SQL in @Query of Repository
Für den Typ wurde keine Eigenschaftsliste gefunden, da es sich um eine nicht benannte Abfrage von Spring Data JPA handelt
Beispielcode für die Singleton-Implementierung mit enum
ODER suchen Sie mit der Spring Data Jpa-Spezifikation
Existiert mit der Spezifikation in Spring Data JPA
Sortieren nach Spring Data JPA (mit zusammengesetzter Schlüsselsortierung)
Ich benötige eine Validierung der Federdaten für Pageable ~
Überprüfen Sie das Verhalten von getOne-, findById- und Abfragemethoden mit Spring Boot + Spring Data JPA
Bis zur Verwendung von Spring Data und JPA Part 1
Beispielcode für die Protokollausgabe von Java + SLF4J + Logback
Beispiel für die Verwendung von vue.config.js
[Enum] Verwenden Sie Rails Enum, um die Lesbarkeit von Daten zu verbessern