Java Hibernate TypeMismatchException-为类提供了错误类型的id

Java Hibernate TypeMismatchException-为类提供了错误类型的id,java,spring,hibernate,spring-data-jpa,Java,Spring,Hibernate,Spring Data Jpa,自从上周五以来,我一直在处理一个hibernate问题,非常感谢大家对我的帮助 在执行简单的获取查询时,我遇到了hibernate的问题。我有两个表:Trade和TradeDetails。交易与交易详情之间存在一对一的单向关系 表结构: 实体定义: @Entity(name = "Trade") @Table(name = "trade", uniqueConstraints = @UniqueConstraint(columnNames = {"trade_num", "fund", "st

自从上周五以来,我一直在处理一个hibernate问题,非常感谢大家对我的帮助

在执行简单的获取查询时,我遇到了hibernate的问题。我有两个表:
Trade
TradeDetails
。交易与交易详情之间存在一对一的单向关系

表结构:

实体定义:

@Entity(name = "Trade")
@Table(name = "trade", uniqueConstraints = @UniqueConstraint(columnNames = {"trade_num", "fund", "stop_date"}))
public class Trade {
    @EmbeddedId
    private TradePK tradePK;

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumns({
            @JoinColumn(name = "fund", referencedColumnName = "fund"),
            @JoinColumn(name = "cusip", referencedColumnName = "cusip"),
            @JoinColumn(name = "trade_num", referencedColumnName = "trade_num"),
            @JoinColumn(name = "start_date", referencedColumnName = "pos_date"),
//            @JoinColumn(name = "pos_date", referencedColumnName = "start_date"),
            @JoinColumn(name = "stop_date", referencedColumnName = "stop_date")
    })
    private TradeDetails tradeDetails;

    @Column(name = "description")
    private String description;
}

@Embeddable
public class TradePK  implements Serializable {
    @Column(name = "start_date", nullable = false)
    private Date startDate;

    @Column(name = "stop_date", nullable = false)
    private Date stopDate;

    @Column(name = "fund")
    private int fund;

    @Column(name = "cusip", nullable = false)
    private String cusip;

    @Column(name = "trade_num")
    private int tradeNum;
}

@Entity(name = "TradeDetails")
@Table(name = "trade_details")
public class TradeDetails {
    @EmbeddedId
    private TradeDetailsPK tradeDetailsPK;

    @Column(name = "amount")
    private float amount;

    @Column(name = "broker_name")
    private String brokerName;
}

@Embeddable
public class TradeDetailsPK implements Serializable {
    @Column(name = "fund")
    private int fund;

    @Column(name = "pos_date", nullable = false)
    private Date posDate;

    @Column(name = "cusip", nullable = false)
    private String cusip;

    @Column(name = "trade_num")
    private int tradeNum;

    @Column(name = "stop_date", nullable = false)
    private Date stopDate;
}
这是我的存储库类:

@Repository
public interface TradeRepository extends JpaRepository<Trade, TradePK> {
    String QUERY = "select T.* " +
            "from trade T, trade_details TD " +
            "where T.fund = :fund " +
            "and T.cusip = :cusip " +
            "and TD.fund = T.fund " +
            "and TD.cusip = T.cusip " +
            "and TD.trade_num = T.trade_num";

    @Query(value = QUERY, nativeQuery = true)
    List<Trade> findTradeByFundAndCusip(@Param("fund") int fund, @Param("cusip") String cusip);
}
我认为问题在于
@OneToOne
。我之所以这样说,是因为当我将关系更改为
@OneToMany
时,我能够获取数据。但是我不明白,
@OneToOne
有什么问题。如果类的id类型错误,我甚至无法理解id不匹配是怎么可能的

注:

  • 无法更改表结构、数据库的状态 无法更改
  • 此外,我正在使用lombok库-在模型类中使用
    @Data
    @allargsconstuctor
    noargsconstuctor
  • 将我的示例代码添加到github:

  • 由于方法
    FindTradeByFund和CUSIP
    返回一个
    列表
    ,因此查询应以
    从交易T中选择T开始,交易详细信息TD
    而不是
    从…中选择*;另外,使用本机查询是否有充分的理由?抱歉,复制和粘贴时的疏忽。它是
    T.*
    ,但不知何故它被修改为
    *
    。在这里和我的示例代码中将其更改为
    *
    。我也看到了同样的问题anyways@Jesper-不,我不熟悉hibernate,从hibernate文档中学习。所以我从原生SQL开始,但我的计划是利用SpringDataJPA的方法,比如
    publicList findTradeByFundAndCusip(int-fund,String-cusip)
    由于方法
    FindTradeByFund和CUSIP
    返回一个
    列表
    查询应以
    从交易T中选择T开始,交易详细信息TD
    而不是
    从…
    中选择*;另外,使用本机查询是否有充分的理由?抱歉,复制和粘贴时的疏忽。它是
    T.*
    ,但不知何故它被修改为
    *
    。在这里和我的示例代码中将其更改为
    *
    。我也看到了同样的问题anyways@Jesper-不,我不熟悉hibernate,从hibernate文档中学习。所以我从原生SQL开始,但我的计划是利用SpringDataJPA的方法,比如
    publicList findTradeByFundAndCusip(int-fund,String-cusip)
    
    Exception in thread "main" org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.TypeMismatchException: Provided id of the wrong type for class com.rdm.learnasync.model.tradedetails.TradeDetails. Expected: class com.rdm.learnasync.model.tradedetails.TradeDetailsPK, got class com.rdm.learnasync.model.trade.TradePK; nested exception is java.lang.IllegalArgumentException: org.hibernate.TypeMismatchException: Provided id of the wrong type for class com.rdm.learnasync.model.tradedetails.TradeDetails. Expected: class com.rdm.learnasync.model.tradedetails.TradeDetailsPK, got class com.rdm.learnasync.model.trade.TradePK
        at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:374)
        at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:257)
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:528)
        at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)
        at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242)
        at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:153)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
        at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:149)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
        at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
        at com.sun.proxy.$Proxy82.findTradeByFundAndCusip(Unknown Source)
        at com.rdm.learnasync.service.TradeService.find(TradeService.java:21)
        at com.rdm.learnasync.LearnAsyncApplication.main(LearnAsyncApplication.java:20)
    Caused by: java.lang.IllegalArgumentException: org.hibernate.TypeMismatchException: Provided id of the wrong type for class com.rdm.learnasync.model.tradedetails.TradeDetails. Expected: class com.rdm.learnasync.model.tradedetails.TradeDetailsPK, got class com.rdm.learnasync.model.trade.TradePK
        at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1536)
        at org.hibernate.query.Query.getResultList(Query.java:165)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at org.springframework.orm.jpa.SharedEntityManagerCreator$DeferredQueryInvocationHandler.invoke(SharedEntityManagerCreator.java:409)
        at com.sun.proxy.$Proxy88.getResultList(Unknown Source)
        at org.springframework.data.jpa.repository.query.JpaQueryExecution$CollectionExecution.doExecute(JpaQueryExecution.java:126)
        at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:88)
        at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:154)
        at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:142)
        at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:618)
        at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:605)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
        at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:80)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:366)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:99)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
        at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139)
        ... 9 more
    Caused by: org.hibernate.TypeMismatchException: Provided id of the wrong type for class com.rdm.learnasync.model.tradedetails.TradeDetails. Expected: class com.rdm.learnasync.model.tradedetails.TradeDetailsPK, got class com.rdm.learnasync.model.trade.TradePK
        at org.hibernate.event.internal.DefaultLoadEventListener.checkIdClass(DefaultLoadEventListener.java:155)
        at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:71)
        at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:113)
        at org.hibernate.internal.SessionImpl.fireLoadNoChecks(SessionImpl.java:1176)
        at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:1041)
        at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:687)
        at org.hibernate.type.EntityType.resolve(EntityType.java:464)
        at org.hibernate.engine.internal.TwoPhaseLoad.doInitializeEntity(TwoPhaseLoad.java:231)
        at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:162)
        at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:1179)
        at org.hibernate.loader.Loader.processResultSet(Loader.java:1028)
        at org.hibernate.loader.Loader.doQuery(Loader.java:964)
        at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:354)
        at org.hibernate.loader.Loader.doList(Loader.java:2838)
        at org.hibernate.loader.Loader.doList(Loader.java:2820)
        at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2652)
        at org.hibernate.loader.Loader.list(Loader.java:2647)
        at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:338)
        at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:2131)
        at org.hibernate.internal.AbstractSharedSessionContract.list(AbstractSharedSessionContract.java:1163)
        at org.hibernate.query.internal.NativeQueryImpl.doList(NativeQueryImpl.java:173)
        at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1530)
        ... 29 more