Comment puis-je utiliser spring data jpa pour la requête jsonb de la colonne?
Je vais avoir un problème pour faire cette requête native droit contre une postgres 9.4 exemple.
Mon dépôt a une méthode:
@Query(value = "SELECT t.* " +
"FROM my_table t " +
"WHERE t.field_1 = ?1 " +
"AND t.field_2 = 1 " +
"AND t.field_3 IN ?2 " +
"AND t.jsonb_field #>> '{key,subkey}' = ?3",
nativeQuery = true)
List<Entity> getEntities(String field1Value,
Collection<Integer> field3Values,
String jsonbFieldValue);
Mais les journaux montrent ceci:
SELECT t.* FROM my_table t
WHERE t.field_1 = ?1
AND t.field_2 = 1
AND t.field_3 IN ?2
AND t.jsonb_field ? '{key,subkey}' = ?3
Et je reçois cette exception:
Exception interne: org.postgresql.util.PSQLException: Aucune valeur
spécifié pour le paramètre 2.
J'ai enregistré les paramètres directement avant l'invocation de méthode, et ils sont tous fournis.
Je ne suis pas sûr pourquoi #>>
montre ?
dans le journal. Ai-je besoin pour échapper à #>>
? Dois-je formater la collection pour IN
? Ai-je besoin pour échapper à la json chemin?
Lorsque j'exécute la requête directement à l'encontre de la db, il fonctionne. Exemple:
SELECT *
FROM my_table t
WHERE t.field_1 = 'xxxx'
AND t.field_2 = 1
AND t.field_3 IN (13)
AND t.jsonb_field #>> '{key,subkey}' = 'value'
- avez-vous été en mesure de résoudre ce problème? Si c'est à partir de l'une des réponses pourrait vous en choisir un? Si non, pourriez-vous poster la solution que vous avez une réponse
- on dirait qu'il ne fonctionne pas avec eclipselink. J'ai fini par aller un itinéraire différent.
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé très utile le Spécification api à partir du printemps de données.
Disons que nous avons une entité avec le nom
Product
et une propriété avec le nomtitle
de type JSON(B).Je suppose que cette propriété contient le titre du Produit dans les différentes langues. Un exemple pourrait être:
{"EN":"Multicolor LED light", "GR":"Πολύχρωμο LED φώς"}
.Le code source ci-dessous trouve un (ou plusieurs dans le cas où il n'est pas un champ unique) produit par le titre et les paramètres régionaux passés comme arguments.
Vous pouvez trouver une autre réponse au sujet de la façon dont vous devriez utiliser les Données du Printemps ici.
Espérons que cela aide.
Si l'opérateur est en train d'être convertis à un point d'interrogation pour une raison ou une autre, alors vous devriez essayer d'utiliser la fonction au lieu. Vous pouvez trouver la fonction correspondante à l'aide de
\doS+ #>>
dans le psql console. Il nous dit que la fonction appelée estjsonb_extract_path_text
. Ce serait faire de votre requête:field IN (val1,val2)
est transformé en, c'est l'équivalentfield = ANY('{val1,val1}')
. Si vous passer comme un tableau àfield = ANY ( ? )
avec les parenthèses, il fonctionne de la même façon. L'équivalent pourNOT IN
estfield <> ALL( ? )
. Bien sûr, cela vous oblige à créer la chaîne de la représentation de la matrice par vous-même, assurez-vous d'échapper à toutes les chaînes correctement.jsonb_extract_path_text
, la requête a échoué avec une nouvelle exception. Quand j'ai cherché à l'exception que j'ai trouvé stackoverflow.com/a/6279110/918608 et stackoverflow.com/a/41564377/918608. Il semble que je doit avoir un nombre constant de valeurs dans ma liste, et je dois énumérer dans ma requête native. N'est-ce pas le cas?Je suggère de ne pas suivre ce chemin, j'ai préférez suivre générique CRUD chemin (d'ailleurs à travailler sur advanced auto généré des méthodes DAO dans la façon de StrongLoop de Bouclage n'a, pour le Printemps des Données Reste plugin maven, mais c'est expérimental dans l'instant uniquement).
Mais avec cette JSON, maintenant quoi faire... je suis à la recherche de quelque chose de semblable à MongoDB JSON traitement au Printemps de Données via @annotation de documents, mais ce n'est pas encore disponible. Mais il y a d'autres manières 🙂
En général, il est à propos de la mise en œuvre de votre JSON type d'utilisateur (UserType interface):
Enfin, vous avez besoin pour améliorer votre JPA classes avec les spécifications de votre mise en œuvre type d'utilisateur:
regarder l'autre les articles ici:
Cartographie postgreSQL JSON colonne à Hibernate type de valeur
La mise en œuvre intégrale exemple est disponible ici:
Similaire, mais la petite autre exemple est disponible ici:
http://www.wisely.top/2017/06/27/spring-data-jpa-postgresql-jsonb/?d=1
Vous pouvez également utiliser le
FUCT
JPQL clétage pour appeler des fonctions personnalisées et ne pas utiliser une requête native.Quelque chose comme ceci,