You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Currently JdbcTemplate does not support SELECT statements that use the VALUES keyword. Here is an example from spring-data-jdbc that uses JdbcTemplate under the hood:
@RepositoryinterfaceMyRepository {
@Query("SELECT * FROM my_entity WHERE id IN (VALUES (:ids))")
List<MyEntity> myQuery(List<String> ids)
}
:ids is not properly expanded (it needs to put every list entry into ()) and thus generates wrong SQL.
I know this would be complex to support for complex objects types as IN-statements works with tuples in some databases but the simple, one-valued variant should be pretty straightforward.
At least PostgreSQL generates different plans for a simple IN vs IN VALUES clause, especially when the input list is big (>100) which perform quite differently (10-30% worse for us).
Using a VALUES list is also interesting when using CTE (WITH) to populate a temporary table with user provided input, this is not achievable with an IN statement.
Disclaimer: I haven't checked if VALUES expansion works in custom INSERTS
The text was updated successfully, but these errors were encountered:
I suppose this works fine with regular positional parameters (where we do not parse the provided SQL ourselves), and you are effectively asking for NamedParameterJdbcTemplate support for VALUES, expanding a nested named parameter accordingly?
jhoeller
changed the title
JdbcTemplate: Missing support for VALUES list in SELECT statements
NamedParameterJdbcTemplate: Missing support for VALUES list in SELECT statements
Dec 18, 2023
I suppose this works fine with regular positional parameters (where we do not parse the provided SQL ourselves), and you are effectively asking for NamedParameterJdbcTemplate support for VALUES, expanding a nested named parameter accordingly?
Yes, this is correct. Spring Data JDBC uses NamedParameterJdbcTemplate and it's named parameters exclusively.
sbrannen
changed the title
NamedParameterJdbcTemplate: Missing support for VALUES list in SELECT statementsNamedParameterJdbcTemplate: Missing support for VALUES list in SELECT statements
Jan 3, 2024
sbrannen
changed the title
NamedParameterJdbcTemplate: Missing support for VALUES list in SELECT statements
Support VALUES list in SELECT statements in NamedParameterJdbcTemplateJan 3, 2024
bclozel
changed the title
Support VALUES list in SELECT statements in NamedParameterJdbcTemplate
Support VALUES list in SELECT statements in NamedParameterJdbcTemplate
Feb 14, 2024
Preamble: I have been sent here by @schauder in spring-data-relational in regards to spring-projects/spring-data-relational#1300.
Currently
JdbcTemplate
does not supportSELECT
statements that use theVALUES
keyword. Here is an example from spring-data-jdbc that usesJdbcTemplate
under the hood::ids
is not properly expanded (it needs to put every list entry into()
) and thus generates wrong SQL.I know this would be complex to support for complex objects types as
IN
-statements works with tuples in some databases but the simple, one-valued variant should be pretty straightforward.At least PostgreSQL generates different plans for a simple
IN
vsIN VALUES
clause, especially when the input list is big (>100) which perform quite differently (10-30% worse for us).Using a
VALUES
list is also interesting when using CTE (WITH
) to populate a temporary table with user provided input, this is not achievable with anIN
statement.Disclaimer: I haven't checked if
VALUES
expansion works in customINSERTS
The text was updated successfully, but these errors were encountered: