Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

980
Views
Consulta nativa del operador JPA y JSON

Estoy tratando de hacer que esta consulta funcione en JPA:

 SELECT * FROM contrat WHERE contrat_json @> '{"nom" :"hever"}';

Funciona perfectamente con postgresql pero cuando lo integro con JPA me sale el siguiente error:

El parámetro con esa posición [1] no existía

Mi código:

 @Transactional @Query(nativeQuery = true,value = "select p from Contrat p where contrat_json @> '{\"nom\":\":nom\"}'") public List<Contrat> findByNomRestrict(@Param("nom") String nom);

Creo que no reconoce @> a pesar de la consulta nativa, ¿tienes una idea?

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

Los titulares de parámetros no se entienden dentro de los literales: '...:nom...' contendrá los caracteres :nom , no los valores vinculados de nom .

Para PostgreSQL 9.5 (y versiones posteriores), use:

 SELECT * FROM contrat WHERE contrat_json @> jsonb_build_object('nom', :nom)

Para 9.4:

 SELECT * FROM contrat WHERE contrat_json @> CAST(json_build_object('nom', :nom) AS jsonb)

Para 9.3 (y versiones anteriores), no hay un operador de contención JSON (ni del tipo jsonb ).

http://rextester.com/AUHP11519

over 4 years ago · Santiago Trujillo Report

0

Tuve un problema similar con mi consulta nativa. El nombre del campo jsonb se llama data y es simple

 { "name" : "genderList", "displayName" : "gender list" }

Quiero buscar por nombre con JpaRepository, y aquí está mi Repositorio

 @Repository public interface LookupListRepository extends JpaRepository<LookupList, UUID> { @Query(value = "SELECT * FROM lookup_list WHERE data->>'name' = :name", nativeQuery = true) List<LookupList> findByName(@Param("name") String name); }

Necesitas nativeQuery = true . Con nativeQuery = true , esto también funciona.

 SELECT * FROM lookup_list WHERE jsonb_extract_path_text(data, 'name') = :name

Veo su anotación @Transactional, asumo que tiene la consulta nativa además del método de servicio de la aplicación. ¿Puede intentar mover todas las consultas nativas en el repositorio y usar JpaRepository, y usar el método de repositorio en su servicio de aplicación? Así es como mi servicio de aplicación usa el repositorio.

 public class LookupListServiceImpl implements LookupListService { @Autowired LookupListRepository lookupListRepository; @Override @Transactional public void changeLookupList(LookupListDto lookupListDto) { List<LookupList> lookupLists = lookupListRepository.findByName(lookupListDto.getName()); ... } }

Referencia para el repositorio JPA http://docs.spring.io/spring-data/jpa/docs/1.3.0.RELEASE/reference/html/jpa.repositories.html

over 4 years ago · Santiago Trujillo Report

0

Con PostgreSQL y JSON, probablemente se encontrará con la necesidad ? u otros operadores extraños, por lo que es mejor que use sus funciones equivalentes en su lugar. Puede buscarlos en la consola psql como este \doS+ @> .

Su consulta no es nativa, como dice el parámetro.

 select p from Contrat p where...

Solo le dará un error cuando llegue a la base de datos.

Prueba algo como

 @Query(nativeQuery = true, value = "select * from Contrat where jsonb_contains(contrat_json, :nom )")

y simplemente enlace "{\"nom\":\"" + param + "\"}" como parámetro

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!