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
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.
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é 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;
}
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.
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);
}
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