加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

spring – 在JPA 2.1中使用Enum的@ConstructorResult

发布时间:2020-12-15 01:49:01 所属栏目:大数据 来源:网络整理
导读:在使用@SqlResultSetMapping的@ConstructorResult时,我不知道如何在@ColumnResult类型中使用Enum @SqlResultSetMapping(name="DetailAndResult",classes={ @ConstructorResult(targetClass=DetailAndResult.class,columns={ @ColumnResult(name="id",type= S

在使用@SqlResultSetMapping的@ConstructorResult时,我不知道如何在@ColumnResult类型中使用Enum

@SqlResultSetMapping(name="DetailAndResult",classes={
                @ConstructorResult(targetClass=DetailAndResult.class,columns={
                        @ColumnResult(name="id",type= String.class),@ColumnResult(name="runId",type=Integer.class),@ColumnResult(name="subRunId",@ColumnResult(name="transactionId",@ColumnResult(name="referenceNumber",type=String.class),@ColumnResult(name="customerName",@ColumnResult(name="transactionType",type=TransactionType.class),@ColumnResult(name="transactionResultStatus",type=String.class)

                })
        }
)

在上面的配置中,名称’transactionType’是TransactionType Enum.在这里使用Enum的正确方法是什么.

如果上面是正确的方法然后我得到这个异常(如果我将删除枚举字段,然后没有异常)所以认为应该有另一种方式来使用它.

Caused by: javax.persistence.PersistenceException: org.hibernate.type.SerializationException: could not deserialize
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1763) ~[hibernate-entitymanager-4.3.6.Final.jar:4.3.6.Final]
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677) ~[hibernate-entitymanager-4.3.6.Final.jar:4.3.6.Final]
    at org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:458) ~[hibernate-entitymanager-4.3.6.Final.jar:4.3.6.Final]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_51]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_51]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_51]
    at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_51]
    at org.springframework.orm.jpa.SharedEntityManagerCreator$DeferredQueryInvocationHandler.invoke(SharedEntityManagerCreator.java:333) ~[spring-orm-4.0.5.RELEASE.jar:4.0.5.RELEASE]
    at com.sun.proxy.$Proxy146.getResultList(Unknown Source) ~[na:na]

使用hibernateTemplate,我们使用的是sqlquery.addscalar,并且有一种方法可以使用org.hibernate.type.Type来使用Enum.

TypeLocatorImpl(new TypeResolver()).custom(EnumType.class,params)

请建议这样的事情是否会用于@SqlResultSetMapping和@ConstructorResult

最佳答案
我也遇到了这个问题,经过相当广泛的搜索后没有找到任何东西.我已经远远看了源代码,据我所知,根本没有任何处理枚举(虽然当然我可能会遗漏一些东西).

我最终做的是创建一个替代构造函数,它为枚举类型接受一个String,然后将它传递给枚举的valueOf()方法.

例如.

更改你的@SqlResultSetMapping来做到这一点:

@ColumnResult(name="transactionType",

然后在你的类的构造函数中:

public DetailAndResult(...,String transactionType,...) {
    ...
    this.transactionType = TransactionType.valueOf(transactionType);
    ...
}

令人讨厌的是我们必须这样做,但只要您的枚举在数据库中存储为String(即实体上的列使用@Enumerated(EnumType.STRING)注释),它就可以工作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读