Java Hibernate TypeMismatchException-为类提供了错误类型的id
自从上周五以来,我一直在处理一个hibernate问题,非常感谢大家对我的帮助 在执行简单的获取查询时,我遇到了hibernate的问题。我有两个表: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
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