J'ai trouvé très utile l'API de spécification à partir des données de printemps.
Disons que nous avons une entité avec le nom Product
et une propriété avec le nom title
de type JSON(B).
Je suppose que cette propriété contient le titre du produit dans différentes langues. Un exemple pourrait être :{"EN":"Multicolor LED light", "EL":"Πολύχρωμο LED φώς"}
.
Le code source ci-dessous trouve un produit (ou plusieurs s'il ne s'agit pas d'un champ unique) par titre et paramètres régionaux passés en arguments.
@Repository
public interface ProductRepository extends JpaRepository<Product, Integer>, JpaSpecificationExecutor<Product> {
}
public class ProductSpecification implements Specification<Product> {
private String locale;
private String titleToSearch;
public ProductSpecification(String locale, String titleToSearch) {
this.locale = locale;
this.titleToSearch = titleToSearch;
}
@Override
public Predicate toPredicate(Root<Product> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
return builder.equal(builder.function("jsonb_extract_path_text", String.class, root.<String>get("title"), builder.literal(this.locale)), this.titleToSearch);
}
}
@Service
public class ProductService {
@Autowired
private ProductRepository productRepository;
public List<Product> findByTitle(String locale, String titleToSearch) {
ProductSpecification cs = new ProductSpecification(locale, titleToSearch);
return productRepository.find(cs);
// Or using lambda expression - without the need of ProductSpecification class.
// return productRepository.find((Root<ProductCategory> root, CriteriaQuery<?> query, CriteriaBuilder builder) -> {
// return builder.equal(builder.function("jsonb_extract_path_text", String.class, root.<String>get("title"), builder.literal(locale)), titleToSearch);
// });
}
}
Vous pouvez trouver une autre réponse sur la façon dont vous devriez utiliser les données de printemps ici.
J'espère que cela vous aidera.