1

J'ai une simple entité@SqlResultSetMapping @ConstructorResult @ColumnResult ne fonctionne pas pour java.time.LocalDate

@Entity 
@NamedNativeQueries({ 
    @NamedNativeQuery(name = "Account.dailyRegistered", 
     query = "select date(date_trunc('day', creation_date)) as period, count(1) as metric" 
      + " from account " 
      + "group by period " 
      + "order by period", 
     resultSetMapping = "PeriodMetric.byDay") 
}) 
@SqlResultSetMappings({ 
    @SqlResultSetMapping(
     name = "PeriodMetric.byDay", 
     classes = { 
      @ConstructorResult(
       targetClass = PeriodMetric.class, 
       columns = { 
        @ColumnResult(name = "period", type = java.time.LocalDate.class), 
        @ColumnResult(name = "metric", type = Integer.class) 
       } 
      ) 
     } 
    ) 
}) 
public class Account {...} 



public class PeriodMetric { 
    private LocalDate period; 
    private Integer metric; 

    public PeriodMetric(LocalDate period, Integer metric) { 
     ... 
    } 
    ... 
} 

public interface AccountRepository extends JpaRepository<Account, Long> { 
    @Query(name = "Account.dailyRegistered", nativeQuery = true) 
    List<PeriodMetric> findDailyRegistered(); 
} 

Comme vous pouvez le voir, je veux utiliser POJO comme résultat par requête native du nom et de l'utiliser dans le référentiel JPA de données de printemps. Quand j'appelle la méthode de dépôt que je reçois l'exception suivante:

Caused by: org.hibernate.type.SerializationException: could not deserialize 
    at org.hibernate.internal.util.SerializationHelper.doDeserialize(SerializationHelper.java:243) 
    at org.hibernate.internal.util.SerializationHelper.deserialize(SerializationHelper.java:287) 
    at org.hibernate.type.descriptor.java.SerializableTypeDescriptor.fromBytes(SerializableTypeDescriptor.java:138) 
    at org.hibernate.type.descriptor.java.SerializableTypeDescriptor.wrap(SerializableTypeDescriptor.java:113) 
    at org.hibernate.type.descriptor.java.SerializableTypeDescriptor.wrap(SerializableTypeDescriptor.java:27) 
    at org.hibernate.type.descriptor.sql.VarbinaryTypeDescriptor$2.doExtract(VarbinaryTypeDescriptor.java:60) 
    at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:47) 
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:235) 
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:231) 
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:227) 
    at org.hibernate.loader.custom.ScalarResultColumnProcessor.extract(ScalarResultColumnProcessor.java:54) 
    at org.hibernate.loader.custom.ConstructorResultColumnProcessor.extract(ConstructorResultColumnProcessor.java:58) 
    at org.hibernate.loader.custom.ResultRowProcessor.buildResultRow(ResultRowProcessor.java:83) 
    at org.hibernate.loader.custom.ResultRowProcessor.buildResultRow(ResultRowProcessor.java:60) 
    at org.hibernate.loader.custom.CustomLoader.getResultColumnOrRow(CustomLoader.java:414) 
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:756) 
    at org.hibernate.loader.Loader.processResultSet(Loader.java:972) 
    at org.hibernate.loader.Loader.doQuery(Loader.java:930) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:336) 
    at org.hibernate.loader.Loader.doList(Loader.java:2610) 
    at org.hibernate.loader.Loader.doList(Loader.java:2593) 
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2422) 
    at org.hibernate.loader.Loader.list(Loader.java:2417) 
    at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:336) 
    at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:1980) 
    at org.hibernate.internal.AbstractSessionImpl.list(AbstractSessionImpl.java:322) 
    at org.hibernate.internal.SQLQueryImpl.list(SQLQueryImpl.java:125) 
    at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:606) 
    at org.hibernate.jpa.internal.QueryImpl.getSingleResult(QueryImpl.java:529) 
    at org.springframework.data.jpa.repository.query.JpaQueryExecution$SingleEntityExecution.doExecute(JpaQueryExecution.java:206) 
    at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:78) 
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:100) 
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:91) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:462) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:440) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:61) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) 
    ... 7 more 
Caused by: java.io.StreamCorruptedException: invalid stream header: 32303136 
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:806) 
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:299) 
    at org.hibernate.internal.util.SerializationHelper$CustomObjectInputStream.<init>(SerializationHelper.java:309) 
    at org.hibernate.internal.util.SerializationHelper$CustomObjectInputStream.<init>(SerializationHelper.java:299) 
    at org.hibernate.internal.util.SerializationHelper.doDeserialize(SerializationHelper.java:218) 
    ... 49 more 

Je passe toute la journée à jouer avec rien de configuration aide. Des idées que je fais incorrectement?

BTW,

Il doit être simple basé sur un article comme celui-ci http://www.thoughts-on-java.org/result-set-mapping-constructor-result-mappings/. J'utilise Spring Data JPA 1.9.5.RELEASE, Hibernate 5.1.0.Final, Hibernate-Jpa-api 2.1.

Jsr310JpaConverters est ajouté à @EntityScan.

Après le débogage, je l'ai remarqué que dans mon cas Hibernate utilise org.hibernate.type.SerializableType en référence à java.time.LocalDate et ne pouvait pas désérialiser valeur de résultat à LocalDate, mais pour d'autres cas Hibernate utilise org.hibernate.type.DateType en référence à java.time.LocalDate et cela fonctionne pour ces cas (par exemple, pas de requêtes natives nommées).

+0

par exemple Si je remplace LocalDate par String partout cette configuration fonctionne. –

Répondre