簡體   English   中英

Spring Data 2.1.1 org.hibernate.HibernateException:獲得了不同大小的元組和別名?

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

從Spring Boot的1.5.4升級到2.1.0 LTS

我遇到了特定存儲庫方法的一些問題。

我檢查了SO和JIRA提到@Query@ResultsSetMapping的各種問題,並@ResultsSetMapping應用了這些更改,但我仍面臨同樣的問題。

例如這里:

知識庫

@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);
}

實體

@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() {}
....

我錯過了什么嗎?

堆棧跟蹤

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]

調試

調試NativeTupleImpl的實現表明存在別名和元組,但是存在嵌套問題。 有一個具有所有值的元組對象,但有3個別名沒有嵌套,並且是三個實體。 這導致了不匹配

在此輸入圖像描述

參考:

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

在Spring Boot 2.0.0.RELEASE遷移之后,“獲得了不同大小的元組和別名”異常

問題與Hibernate默認如何將其元組實體映射到對象或對象列表有關。

在這種情況下,它期望三個元組映射到POJO中的各個列。

@ConstructorResult它工作的代碼(注意省略@ConstructorResult

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

})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM