मुझे स्प्रिंग डेटा से विशिष्टता एपीआई बहुत मददगार लगी।
मान लें कि हमारे पास Product
नाम वाली एक इकाई है और title
. नाम वाली प्रॉपर्टी प्रकार का JSON(B).
मुझे लगता है कि इस संपत्ति में विभिन्न भाषाओं में उत्पाद का शीर्षक है। एक उदाहरण हो सकता है:{"EN":"Multicolor LED light", "EL":"Πολύχρωμο LED φώς"}
.
नीचे दिया गया स्रोत कोड शीर्षक और स्थान के आधार पर तर्क के रूप में पारित एक (या अधिक यदि यह एक अद्वितीय फ़ील्ड नहीं है) उत्पाद ढूंढता है।
@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);
// });
}
}
आपको स्प्रिंग डेटा का उपयोग करने के तरीके के बारे में एक और उत्तर यहां मिल सकता है।
उम्मीद है कि यह मदद करता है।