sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur använder jag vårdata jpa för att fråga i jsonb-kolumnen?

Jag tyckte att Specification API från fjäderdata var till stor hjälp.
Anta att vi har en enhet med namnet Product och en egenskap med namnet title av typen JSON(B).
Jag antar att den här egenskapen innehåller titeln på produkten på olika språk. Ett exempel kan vara:{"EN":"Multicolor LED light", "EL":"Πολύχρωμο LED φώς"} .
Källkoden nedan hittar en (eller fler om det inte är ett unikt fält) produkt efter titel och språk som skickas som argument.

@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 hitta ett annat svar om hur du bör använda vårdata här.
Hoppas det hjälper.



  1. MySQL IN tillståndsgräns

  2. Riktig flyktsträng och PDO

  3. 2 sätt att få storleken på en databas i PostgreSQL

  4. Använder Salesforce SOQL från Linux