sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan bruger jeg spring data jpa til at forespørge på jsonb-kolonnen?

Jeg fandt Specification API'et fra springdata meget nyttigt.
Lad os sige, at vi har en enhed med navnet Product og en egenskab med navnet title af typen JSON(B).
Jeg antager, at denne egenskab indeholder titlen på produktet på forskellige sprog. Et eksempel kunne være:{"EN":"Multicolor LED light", "EL":"Πολύχρωμο LED φώς"} .
Kildekoden nedenfor finder et (eller flere, hvis det ikke er et unikt felt) produkt efter titel og lokalitet, der er sendt som argumenter.

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

Du kan finde et andet svar om, hvordan du skal bruge forårsdataene her.
Håber det hjælper.



  1. Optimer GROUP BY-forespørgsel for at hente seneste række pr. bruger

  2. MS-Access baseklasse og afledte objekter

  3. Forklar Planlæg Cost Pain Point

  4. Hvad er Greenplum Database? Introduktion til Big Data-databasen