it-swarm.com.de

Ausnahme der Spring Boot 2.0.0.RELEASE-Migration: "Unterschiedliche Größe von Tupeln und Aliasnamen"

//imports, etc.

@Entity
@Table(name = "TSTRANS")
@SqlResultSetMappings(
        {                   
                @SqlResultSetMapping(name = TS_TRANS_EMP_STAT,
                        classes = {
                                @ConstructorResult(
                                        targetClass = EmpStat.class,
                                        columns = {
                                                @ColumnResult(name = "EMPID", type = Long.class),
                                                @ColumnResult(name = "CODE", type = String.class),
                                                @ColumnResult(name = "TOTALCOUNT", type = Integer.class)
                                        }
                                )
                        })
        }
)
@NamedNativeQueries({
        @NamedNativeQuery(name = "TsTrans.getStat", query = "select * from SP_TASK_STATS_EMP  (:in_empid, :in_gidstr, :in_onlytodo)", resultSetMapping = TS_TRANS_EMP_STAT)
})
public class TsTrans extends TsTransCommon {
    public static final String TSTRANS_BADGE = "TSTRANS_BADGE";

    private static final long serialVersionUID = -3391028108003625153L;
    public static final String TS_TRANS_EMP_STAT = "TsTrans.empStat";
    public static final String TS_TRANS_SCHEDULE_STAT = "TsTrans.getScheduleStat";
    public static final String TS_TRANS_FOLLOWUP = "TS_TRANS_FOLLOWUP";
}

Dies ist die Entität.

// imports, etc.

public class EmpStat extends BaseStat {

    private static final long serialVersionUID = -4410895509438727581L;
    private Long mEmpid;

    public EmpStat(Long aEmpid, String aCode, Integer aTotalcount) {
        super(aCode, aTotalcount);
        mEmpid = aEmpid;
    }

    public Long getEmpid() {
        return mEmpid;
    }

    public void setEmpid(Long aEmpid) {
        mEmpid = aEmpid;
    }
}

Dies ist der Nicht-Entitäten-Pojo, der Rückgabetyp "namedquery".

// imports, etc.

@Repository
public interface TsTransRepository extends TsTransCommonRepository<TsTrans> {
    List<EmpStat> getStat(@Param("in_empid") Long aEmpid, @Param("in_gidstr") String aGidstr, @Param("in_onlytodo") Boolean aOnlytodo);

}

Dies ist die Repository-Klasse.

Ich benutze diese namednativequeries , um Nicht-Entitäts-Pojos aus gespeicherten Prozeduren zurückzugeben. Es hat ausnahmslos seit Spring Boot 1.5.9 funktioniert. Und auf Spring Boot 2.0.0.M7. Nach der Migration zu 2.0.0.RELEASE trat die folgende Ausnahme auf.

org.hibernate.HibernateException: Got different size of tuples and aliases
    at org.hibernate.jpa.spi.NativeQueryTupleTransformer$NativeTupleImpl.<init>(NativeQueryTupleTransformer.Java:68) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
    at org.hibernate.jpa.spi.NativeQueryTupleTransformer.transformTuple(NativeQueryTupleTransformer.Java:28) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
    at org.hibernate.hql.internal.HolderInstantiator.instantiate(HolderInstantiator.Java:85) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
    at org.hibernate.loader.custom.CustomLoader.getResultList(CustomLoader.Java:430) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.Java:2507) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
    at org.hibernate.loader.Loader.list(Loader.Java:2502) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
    at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.Java:335) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
    at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.Java:2161) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
    at org.hibernate.internal.AbstractSharedSessionContract.list(AbstractSharedSessionContract.Java:1016) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
    at org.hibernate.query.internal.NativeQueryImpl.doList(NativeQueryImpl.Java:152) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
    at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.Java:1414) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
    at org.hibernate.query.Query.getResultList(Query.Java:146) ~[hibernate-core-5.2.14.Final.jar:5.2.14.Final]
    at org.springframework.data.jpa.repository.query.JpaQueryExecution$CollectionExecution.doExecute(JpaQueryExecution.Java:129) ~[spring-data-jpa-2.0.5.RELEASE.jar:2.0.5.RELEASE]
    at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.Java:91) ~[spring-data-jpa-2.0.5.RELEASE.jar:2.0.5.RELEASE]
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.Java:136) ~[spring-data-jpa-2.0.5.RELEASE.jar:2.0.5.RELEASE]
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.Java:125) ~[spring-data-jpa-2.0.5.RELEASE.jar:2.0.5.RELEASE]
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.Java:590) ~[spring-data-commons-2.0.5.RELEASE.jar:2.0.5.RELEASE]
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.Java:578) ~[spring-data-commons-2.0.5.RELEASE.jar:2.0.5.RELEASE]

Habe ich während der Migration etwas verpasst?

12
evracle

In jpa 2.1 wurde das Problem mit der Funktion @Query(nativeQuery = true) für die Repository-Schnittstellenmethode behoben.

https://github.com/spring-projects/spring-data-examples/tree/master/jpa/jpa21#support-for-custom-sqlresultsetmapping-with-constructorresult

10
evracle

Ändern Sie Ihre SqlResultSetMappings in 

@SqlResultSetMappings({
    @SqlResultSetMapping(name = TS_TRANS_EMP_STAT,
        columns = {
            @ColumnResult(name = "EMPID", type = Long.class),
            @ColumnResult(name = "CODE", type = String.class),
            @ColumnResult(name = "TOTALCOUNT", type = Integer.class)
        })
}

und EmpStat von der normalen Klasse zur Schnittstelle ändern:

public interface EmpStat {
    Long getEMPID();
    String getCODE();
    Integer getTOTALCOUNT();
}
7
Songday

Ich habe eine weitere Lösung gefunden: Sie können einfach generic aus der Liste in getStat () entfernen:

@Repository
public interface TsTransRepository extends TsTransCommonRepository<TsTrans> {
    List getStat(@Param("in_empid") Long aEmpid, @Param("in_gidstr") String aGidstr, @Param("in_onlytodo") Boolean aOnlytodo);
}
6
Igor Zboichik

Es gibt verschiedene Ansätze, um das Problem zu beheben. Meist handelt es sich dabei um eine Kombination verschiedener JPA- und Federdatenmerkmale. Ich habe einige Nachforschungen angestellt und hinzugefügt, um https://jira.spring.io/browse/DATAJPA-1280 auszugeben. Um herauszufinden, was Sie tun können, schauen Sie sich dieses Projekt https://github.com/EugeneNik/spring-data-datajpa-1280-example an und führen Sie Tests durch, um zu sehen, welche Ansätze jetzt gut funktionieren. Hinweis: Momentan gibt es keine Möglichkeit, eine Migration ohne Codeänderungen durchzuführen, aber meiner Meinung nach ist es am einfachsten, der Repository-Methode Klassenprojektionsdeklarationen hinzuzufügen. Bei der Definition müssen Sie nicht alle Zuordnungen ändern, aber die Aufrufe von Repositorys müssen ebenfalls geändert werden. Es ist nur ein weiterer Weg, um Ihr Problem zu beheben:

@Repository
public interface TsTransRepository extends TsTransCommonRepository<TsTrans> 
{
    <T> List<T> getStat(@Param("in_empid") Long aEmpid, 
@Param("in_gidstr") String aGidstr, @Param("in_onlytodo") Boolean aOnlytodo, Class<T> beanProjection);

}

Es war ein Fehler, der jetzt behoben wurde: jira.spring.io/browse/DATAJPA-128

Hinzufügen:

@Query(nativeQuery=true) 

am Anfang einer neuen Methode im Repository.

3
user8016158

Ich denke, dies ist der Problembericht in Spring Data JPA: https://jira.spring.io/browse/DATAJPA-1280

Als Workaround können Sie ein Downgrade auf den Spring Data Release Train Kay-SR4 durchführen (SR5 ist die aktuellste Version und die Version, die in Spring Boot 2.0.0 verwendet wird). Einfach hinzufügen:

<spring-data-releasetrain.version>Kay-SR4</spring-data-releasetrain.version>

zu Ihrem <properties>-Abschnitt Ihres pom.xml.

1
candrews

Wie bereits erwähnt, war dies ein Fehler, der in Spring Boot 2.0.0 eingeführt und in DATAJPA-1280 gemeldet wurde.

Es wurde behoben und in Spring Boot 2.0.3 veröffentlicht.

0
Sean Connolly