PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie verwende ich spring data jpa, um die jsonb-Spalte abzufragen?

Ich fand die Spezifikations-API von Spring Data sehr hilfreich.
Nehmen wir an, wir haben eine Entität mit dem Namen Product und eine Eigenschaft mit dem Namen title vom Typ JSON(B).
Ich gehe davon aus, dass diese Eigenschaft den Titel des Produkts in verschiedenen Sprachen enthält. Ein Beispiel könnte sein:{"EN":"Multicolor LED light", "EL":"Πολύχρωμο LED φώς"} .
Der folgende Quellcode findet ein (oder mehr, falls es sich nicht um ein eindeutiges Feld handelt) Produkt nach Titel und Gebietsschema, das als Argumente übergeben werden.

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

Eine weitere Antwort zur Verwendung der Spring Data finden Sie hier.
Hoffe, das hilft.