sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo uso spring data jpa para consultar la columna jsonb?

Encontré muy útil la API de especificación de los datos de Spring.
Digamos que tenemos una entidad con el nombre Product y una propiedad con nombre title de tipo JSON(B).
Supongo que esta propiedad contiene el título del Producto en diferentes idiomas. Un ejemplo podría ser:{"EN":"Multicolor LED light", "EL":"Πολύχρωμο LED φώς"} .
El siguiente código fuente encuentra un producto (o más en caso de que no sea un campo único) por título y configuración regional pasados ​​como argumentos.

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

Puede encontrar otra respuesta sobre la forma en que debe usar Spring Data aquí.
Espero que ayude.