I have native SQL request and it consist of two
- insert - select (with subrequest)
 - select
 
The parameter is list of three String elements and passed to:
@Modifying
@Query(value = " "
//close
+ "INSERT INTO status (is_open,advertisement, updated) "
+ "SELECT "
+ " false, to_close.id, NOW() "
+ "FROM( "
+ " SELECT " 
+ "             ad.id as id, " 
+ "             ad.native_id as native_id, " 
+ "             sc_newest.updated as updated, " 
+ "             status.is_open as is_open " 
+ " FROM advertisement AS ad " 
+ " LEFT JOIN " 
+ "         (SELECT "
+ "             MAX(sc.UPDATED) AS updated, "
+ "             sc.ADVERTISEMENT "
+ "         FROM ADVERTISEMENT AS ad "
+ "         LEFT JOIN STATUS AS sc "
+ "             ON  ad.ID = sc.ADVERTISEMENT "
+ "         WHERE   ad.NATIVE_ID NOT IN  :shown_ads "
+ "         GROUP BY sc.advertisement) AS sc_newest "
+ "     ON ad.id = sc_newest.advertisement "
+ " LEFT JOIN status AS status "
+ "     ON ad.id = status.advertisement AND status.updated = sc_newest.updated "
+ " WHERE "
+ "     status.is_open = true " 
+ "     AND ad.native_id NOT IN :shown_ads) AS to_close ; "
+ ""
// get stored previously 
+ " SELECT "
+ " ADVERTISEMENT.NATIVE_ID "
+ "FROM ADVERTISEMENT "
+ " WHERE "
+ " ADVERTISEMENT.NATIVE_ID IN :shown_ads "
        , nativeQuery = true)
public Set<String> closeReopenFindStored(@Param("shown_ads") List<String> shownNaturalIDs);
Here the log
2017-08-03 07:44:12.353 DEBUG 16162 --- [ main] org.hibernate.SQL :
INSERT INTO status (is_open,advertisement, updated) SELECT false, to_close.id, NOW() FROM( SELECT ad.id as id, ad.native_id as native_id, sc_newest.updated as updated, status.is_open as is_open FROM advertisement AS ad LEFT JOIN (SELECT MAX(sc.UPDATED) AS updated, sc.ADVERTISEMENT FROM ADVERTISEMENT AS ad LEFT JOIN STATUS AS sc ON ad.ID = sc.ADVERTISEMENT WHERE ad.NATIVE_ID NOT IN (?, ?, ?) GROUP BY sc.advertisement) AS sc_newest ON ad.id = sc_newest.advertisement LEFT JOIN status AS status ON ad.id = status.advertisement AND status.updated = sc_newest.updated WHERE status.is_open = true AND ad.native_id NOT IN (?, ?, ?)) AS to_close ; SELECT ADVERTISEMENT.NATIVE_ID FROM ADVERTISEMENT WHERE ADVERTISEMENT.NATIVE_ID IN (?, ?, ?)
2017-08-03 07:44:12.429 TRACE 16162 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [VARCHAR] - [ad1 number] 2017-08-03 07:44:12.430 TRACE 16162 --- [
main] o.h.type.descriptor.sql.BasicBinder : binding parameter [4] as [VARCHAR] - [ad1 number] 2017-08-03 07:44:12.431 TRACE 16162 --- [ main] o.h.type.descriptor.sql.BasicBinder : binding parameter [7] as [VARCHAR] - [ad1 number]2017-08-03 07:44:12.432 WARN 16162 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 90008, SQLState: 90008 2017-08-03 07:44:12.433 ERROR 16162 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : Invalid value "7" for parameter "parameterIndex" [90008-195]
Why this not works?
Update - SQL I run from SQL client fine:
INSERT INTO status (is_open,advertisement, updated) 
SELECT 
    false, to_close.id, NOW() 
FROM( 
    SELECT 
                ad.id as id, 
                ad.native_id as native_id, 
                sc_newest.updated as updated, 
                status.is_open as is_open 
    FROM advertisement AS ad 
    LEFT JOIN 
            (SELECT 
                MAX(sc.UPDATED) AS updated, 
                sc.ADVERTISEMENT 
            FROM ADVERTISEMENT AS ad 
            LEFT JOIN STATUS AS sc 
                ON  ad.ID = sc.ADVERTISEMENT 
            WHERE   ad.NATIVE_ID NOT IN  ('ad1 number','ad2 number', 'new ad') 
            GROUP BY sc.advertisement) AS sc_newest 
        ON ad.id = sc_newest.advertisement 
    LEFT JOIN status AS status 
        ON ad.id = status.advertisement AND status.updated = sc_newest.updated 
    WHERE 
        status.is_open = true 
        AND ad.native_id NOT IN ('ad1 number','ad2 number', 'new ad')) AS to_close ; 
SELECT 
    ADVERTISEMENT.ID AS ad_id,
    ADVERTISEMENT.NATIVE_ID
FROM ADVERTISEMENT
WHERE
    ADVERTISEMENT.NATIVE_ID IN ('ad1 number','ad2 number', 'new ad')