Wie lautet die richtige Syntax (JPA, Spring Data oder SPEL) zum Konvertieren dieser Abfrage in ein Spring Data Repository nativeQuery
?Spring-Daten JPA JSONB-Paramaterisierung
SELECT *
FROM mytable
WHERE f_jsonb_arr_lower(myjsonb -> 'myArray', 'subItem', 'email')
@> '"[email protected]"';
Ich möchte stattdessen einen Eingabeparameter verwenden, von "[email protected]"
Hartcodierung.
Mein Modell: Postgres myTable
mit einer JSONB Spalte myJsonb
:
{
"myArray": [
{
"subItem": {
"email": "[email protected]"
}
},
{
"subItem": {
"email": "[email protected]"
}
}
]
}
Index beschrieben here.
Die hartcodierte Version funktioniert:
@Query(value =
"SELECT m.* " +
" FROM mytable AS m " +
" WHERE f_jsonb_arr_lower(myjsonb -> 'myArray' ,'subItem', 'email') " +
" @> '\"[email protected]\"' " +
" ORDER BY ?#{#pageable} ",
// Spring Data nativeQueries with Pageable require a separate countQuery:
countQuery =
"SELECT count(m.id) " +
" FROM mytable AS m " +
" WHERE f_jsonb_arr_lower(myjsonb -> 'myArray' ,'subItem', 'email') " +
" @> '\"[email protected]\"' ",
nativeQuery = true)
Page<MyTableEntity> findAllHardcodedPageable(Pageable pageable);
Aber versuchen, die lowercaseEmailAddress
Parameter in einem Spring Data Repository nutzen nativeQuery funktioniert nicht:
@Query(value =
"SELECT m.* " +
" FROM mytable AS m " +
" WHERE f_jsonb_arr_lower(myjsonb -> 'myArray' ,'subItem', 'email') " +
" @> '\"?{lowercaseEmailAddress}\"' " +
" ORDER BY ?#{#pageable} ",
countQuery =
"SELECT count(m.id) " +
" FROM mytable AS m " +
" WHERE f_jsonb_arr_lower(myjsonb -> 'myArray' ,'subItem', 'email') " +
" @> '\"?{lowercaseEmailAddress}\"' ",
nativeQuery = true)
Page<MyTableEntity> findAllByEmailPageable
(String lowercaseEmailAddress, Pageable pageable);
In meiner Postgres Abfrageprotokollierung, kann ich sehen, dass die lowercaseEmailAddress
Parameter werden nie gesetzt:
LOG: execute S_2: COMMIT
LOG: execute S_3: BEGIN
LOG: execute <unnamed>: SELECT count(m.id) FROM mytable
AS m WHERE f_jsonb_arr_lower(myjsonb -> 'myArray',
'subitem', 'email') @> '"?1"'
LOG: execute S_11: ROLLBACK