sql >> Databáze >  >> RDS >> PostgreSQL

Jak mohu použít jarní data jpa k dotazu na sloupec jsonb?

Velmi mi pomohlo rozhraní Specification api z jarních dat.
Řekněme, že máme entitu s názvem Product a vlastnost s názvem title typu JSON(B).
Předpokládám, že tato vlastnost obsahuje název Produktu v různých jazycích. Příklad může být:{"EN":"Multicolor LED light", "EL":"Πολύχρωμο LED φώς"} .
Zdrojový kód níže najde (nebo více v případě, že se nejedná o jedinečné pole) produkt podle názvu a národního prostředí předaný jako argumenty.

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

Další odpověď o tom, jak byste měli jarní data používat, najdete zde.
Doufám, že to pomůže.



  1. Jak nasadit Percona XtraDB Cluster 8 pro vysokou dostupnost

  2. Seskupit podle data pouze ve sloupci Datetime

  3. Hledání mezer v sekvencích v tabulce v Oracle

  4. Řešení problémů generátoru číselných řad – 3. část