Spring Data 2.1.1 org.hibernate.HibernateException: Got different size of tuples and aliases?

Viewed 1277

After upgrading from 1.5.4 of Spring Boot to 2.1.0 LTS

I am getting some issues with particular repository methods.

I checked the various issues on SO and JIRA mentioning @Query and @ResultsSetMapping and have applied those changes accordingly, however I still facing the same issue.

For example here:

Repository

@CrossOrigin
@RepositoryRestResource(path = "/iCreateChange")
public interface ICreateChangeRepository extends JpaRepository<ICreateChange, Long> {

  List<ChangeTask> listStartedChangesByInitiator(
        @Param("initiator")
        @RequestParam
        @ApiParam(name = "initiator", value = "initiator")
        String initiator);

  List<ChangeTask> listDataValuesAndStatusByChangeId(
        @Param("changeId")
        @RequestParam
        @ApiParam(name = "changeId", value = "changeId")
        Long changeId);
}

Entity

@SqlResultSetMappings({
    @SqlResultSetMapping(
      name = "StartedChangeMapping",
      classes = @ConstructorResult(
        targetClass = ChangeTask.class,
        columns = {
          @ColumnResult(name = "id", type = Long.class),
          @ColumnResult(name = "status", type = String.class),
          @ColumnResult(name = "data_values", type = String.class)
        }
      )
    ),
    @SqlResultSetMapping(
      name = "ActiveTaskChangeMapping",
      classes = @ConstructorResult(
        targetClass = ChangeTask.class,
        columns = {
          @ColumnResult(name = "id", type = Long.class),
          @ColumnResult(name = "status", type = String.class),
          @ColumnResult(name = "data_values", type = String.class)
        }
      )
    )
})
@NamedNativeQueries({
    @NamedNativeQuery(
      name = "ICreateChange.listStartedChangesByInitiator",
      query =
      "SELECT id as id, status as status, data_values as data_values "
      + "FROM icreate_change "
      + "WHERE initiator = :initiator "
      + "AND workflow_process_id = 0",
      resultSetMapping = "StartedChangeMapping"
    ),
    @NamedNativeQuery(
      name = "ICreateChange.listDataValuesAndStatusByChangeId",
      query =
      "SELECT id as id, status as status, data_values as data_values "
      + "FROM icreate_change "
      + "WHERE id = :changeId",
      resultSetMapping = "ActiveTaskChangeMapping"
    )

})

@Data
@Entity
@Table(name = "icreate_change")
public class ICreateChange {

  public ICreateChange() {}
....

Have I missed something?

Stack Trace

org.hibernate.HibernateException: Got different size of tuples and aliases
    at org.hibernate.jpa.spi.NativeQueryTupleTransformer$NativeTupleImpl.<init>(NativeQueryTupleTransformer.java:68) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.jpa.spi.NativeQueryTupleTransformer.transformTuple(NativeQueryTupleTransformer.java:28) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.hql.internal.HolderInstantiator.instantiate(HolderInstantiator.java:85) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.loader.custom.CustomLoader.getResultList(CustomLoader.java:433) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2506) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.loader.Loader.list(Loader.java:2501) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:338) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:2223) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.internal.AbstractSharedSessionContract.list(AbstractSharedSessionContract.java:1053) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.query.internal.NativeQueryImpl.doList(NativeQueryImpl.java:170) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1505) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.query.Query.getResultList(Query.java:135) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]

Debugging

Debugging the implementation of NativeTupleImpl shows that the aliases and tuples are there, however there is a nesting problem. There is one tuple object with all values, but there are 3 aliases which are not nested and are as three entities. Which is causing the mismatch

enter image description here

Reference:

https://jira.spring.io/si/jira.issueviews:issue-html/DATAJPA-1280/DATAJPA-1280.html

"Got different size of tuples and aliases" exception after Spring Boot 2.0.0.RELEASE migration

1 Answers

The issue was to do with how Hibernate maps its Tuple Entity by default into an Object or list of Objects.

In this case it was expecting three tuples to map to individual columns in the POJO.

This is the code to get it working (note the omission of @ConstructorResult)

@SqlResultSetMapping(
        name = "TaskChangeMapping",
        columns = {
                @ColumnResult(name = "id", type = Long.class),
                @ColumnResult(name = "status", type = String.class),
                @ColumnResult(name = "data_values", type = String.class)

})
Related