sql >> Database >  >> RDS >> PostgreSQL

Hoe gebruik ik lentegegevens jpa om de jsonb-kolom op te vragen?

Ik vond de Specificatie-API van Spring Data erg nuttig.
Laten we zeggen dat we een entiteit hebben met de naam Product en een eigenschap met naam title van het type JSON(B).
Ik neem aan dat deze eigenschap de titel van het Product in verschillende talen bevat. Een voorbeeld zou kunnen zijn:{"EN":"Multicolor LED light", "EL":"Πολύχρωμο LED φώς"} .
De onderstaande broncode vindt een (of meer als het geen uniek veld is) product op titel en landinstelling die als argumenten zijn doorgegeven.

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

Een ander antwoord over de manier waarop u de Spring Data moet gebruiken, vindt u hier.
Hopelijk helpt dat.



  1. Hoe krijg ik het verschil tussen twee rijen voor een kolomveld?

  2. java.sql.SQLException:geen geschikte driver gevonden voor jdbc:microsoft:sqlserver

  3. Uitdagingen bij het schalen van de Moodle MySQL-database

  4. Hoe krijg ik een lijst met MySQL-weergaven?