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')