[JIRA] (HHH-16128) Parameters out of order on inner join with entities with @Inheritance(strategy = InheritanceType.JOINED)
by Jose Freire (JIRA)
Jose Freire ( https://hibernate.atlassian.net/secure/ViewProfile.jspa?accountId=557058%... ) *created* an issue
Hibernate ORM ( https://hibernate.atlassian.net/browse/HHH?atlOrigin=eyJpIjoiN2MyYjU4OTQy... ) / Bug ( https://hibernate.atlassian.net/browse/HHH-16128?atlOrigin=eyJpIjoiN2MyYj... ) HHH-16128 ( https://hibernate.atlassian.net/browse/HHH-16128?atlOrigin=eyJpIjoiN2MyYj... ) Parameters out of order on inner join with entities with @Inheritance(strategy = InheritanceType.JOINED) ( https://hibernate.atlassian.net/browse/HHH-16128?atlOrigin=eyJpIjoiN2MyYj... )
Issue Type: Bug Affects Versions: 5.4.33, 5.6.14 Assignee: Unassigned Attachments: TestCase-ParametersOutOfOrder.tar.gz Components: hibernate-core Created: 01/Feb/2023 16:52 PM Environment: Hibernate 5.6.14.Final, SQL Server, Amazon Correto Priority: Major Reporter: Jose Freire ( https://hibernate.atlassian.net/secure/ViewProfile.jspa?accountId=557058%... )
Having the following entities:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class TestClassSuper implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String text;
private Date date;
private BigDecimal number;
....
}
@Entity
public class TestClassA extends TestClassSuper {
private static final long serialVersionUID = 1L;
private Long id;
....
}
@Entity
public class TestClassB extends TestClassSuper {
private static final long serialVersionUID = 1L;
private Long id;
....
}
The following HQL:
SELECT a.id
FROM org.hibernate.bugs.testclassa a
LEFT JOIN org.hibernate.bugs.testclassa c
ON a.id = c.id AND c. date = : date
LEFT JOIN org.hibernate.bugs.testclassb b
ON a.id = b.id AND a. text = : text
Produces the SQL:
SELECT testclassa0_.id AS col_0_0_
FROM testclassa testclassa0_
INNER JOIN testclasssuper testclassa0_1_
ON testclassa0_.id = testclassa0_1_.id
LEFT OUTER JOIN ( testclassa testclassa1_
INNER JOIN testclasssuper testclassa1_1_
ON testclassa1_.id = testclassa1_1_.id )
ON ( testclassa0_.id = testclassa1_.id
AND testclassa1_1_. date = ? )
LEFT OUTER JOIN ( testclassb testclassb2_
INNER JOIN testclasssuper testclassb2_1_
ON testclassb2_.id = testclassb2_1_.id )
ON ( testclassa0_.id = testclassb2_.id
AND testclassa0_1_. text = ? )
However, by changing the first LEFT JOIN to INNER JOIN in the HQL:
SELECT a.id
FROM org.hibernate.bugs.testclassa a
INNER JOIN org.hibernate.bugs.testclassa c
ON a.id = c.id AND c. date = : date
LEFT JOIN org.hibernate.bugs.testclassb b
ON a.id = b.id AND a. text = : text
Produces the SQL:
SELECT testclassa0_.id AS col_0_0_
FROM testclassa testclassa0_
INNER JOIN testclasssuper testclassa0_1_
ON testclassa0_.id = testclassa0_1_.id
INNER JOIN testclassa testclassa1_
ON 1 = 1
INNER JOIN testclasssuper testclassa1_1_
ON testclassa1_.id = testclassa1_1_.id
LEFT OUTER JOIN ( testclassb testclassb2_
INNER JOIN testclasssuper testclassb2_1_
ON testclassb2_.id = testclassb2_1_.id )
ON ( testclassa0_.id = testclassb2_.id
AND testclassa0_1_. text = ? )
WHERE ( testclassa0_.id = testclassa1_.id
AND testclassa1_1_. date = ? )
The parameter sequence has changed!
In the first query the parameter sequence in the query is: date, text.
In the second query the parameter sequence in the query is: text, date.
But the binding order for the second query is the same as the first query, thus the cast exception on SQL Server:
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Conversion failed when converting date and/or time from character string.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:265)
at com.microsoft.sqlserver.jdbc.SQLServerResultSet$FetchBuffer.nextRow(SQLServerResultSet.java:5479)
at com.microsoft.sqlserver.jdbc.SQLServerResultSet.fetchBufferNext(SQLServerResultSet.java:1798)
at com.microsoft.sqlserver.jdbc.SQLServerResultSet.next(SQLServerResultSet.java:1056)
at org.hibernate.loader.Loader.getRowsFromResultSet(Loader.java:1043)
at org.hibernate.loader.Loader.processResultSet(Loader.java:998)
at org.hibernate.loader.Loader.doQuery(Loader.java:967)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:357)
at org.hibernate.loader.Loader.doList(Loader.java:2868)
Hibernate is binding the parameter of type ‘date’ into the binding position ‘0', but the ‘date’ parameter position has changed to the binding position '1’.
Attached is a test case, however I couldn’t reproduce with H2 database. My guess is that H2 doesn’t care, because the generated SQL is identical.
( https://hibernate.atlassian.net/browse/HHH-16128#add-comment?atlOrigin=ey... ) Add Comment ( https://hibernate.atlassian.net/browse/HHH-16128#add-comment?atlOrigin=ey... )
Get Jira notifications on your phone! Download the Jira Cloud app for Android ( https://play.google.com/store/apps/details?id=com.atlassian.android.jira.... ) or iOS ( https://itunes.apple.com/app/apple-store/id1006972087?pt=696495&ct=EmailN... ) This message was sent by Atlassian Jira (v1001.0.0-SNAPSHOT#100214- sha1:06410ea )
1 year, 11 months