2017-12-18 4 views
2

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 

Antwort

0

Konnten Sie die Antwort:

1) Fahren nur in doppelten Anführungszeichen String mit dem Feder Daten-Repository-Methode:

String emailAddressWithDoubleQuotes = String.format("\"%s\"",emailAddress); 
result = repository.findAllByEmailPageable(emailAddressWithDoubleQuotes, pageRequest).getContent(); 

2) The Spring Repository @Query Bedürfnisse der Spel Ausdruck in Klammern zu haben und zu gegossen werden jsonb:

static final String FIND_ALL_BY_EMAIL_QUERY = " FROM mytable AS m " + 
     " WHERE f_jsonb_arr_lower(metadata -> 'myArray', 'subItem', 'email') " + 
     " @> (?#{#lowercaseEmailAddress})\\:\\:jsonb"; 
@Query(// only use 'ORDER BY #pageableWithNativeSort' on 'value' query: 
     value = "SELECT m.* " + FIND_ALL_BY_EMAIL_QUERY + " ORDER BY ?#{#pageableWithNativeSort} ", 
     // Spring Data nativeQueries with Pageable require a separate 'countQuery': 
     countQuery = "SELECT count(m.id) " + FIND_ALL_BY_EMAIL_QUERY, 
     nativeQuery = true) 
Page<OrderEntity> findAllBysubItemEmail(
     @Param("lowercaseEmailAddress") String lowercaseEmailAddress, 
     @Param("pageableWithNativeSort") Pageable pageableWithNativeSort); 
Verwandte Themen