spring - JPA 2.1 中带有枚举的 @ConstructorResult

标签 spring hibernate jpa jpa-2.1 sqlresultsetmapping

在使用 @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", type=Integer.class),
                        @ColumnResult(name="transactionId", type=Integer.class),
                        @ColumnResult(name="referenceNumber", type=String.class),
                        @ColumnResult(name="customerName", type=String.class),
                        @ColumnResult(name="transactionType", type=TransactionType.class),
                        @ColumnResult(name="transactionResultStatus", type=String.class)

                })
        }
)

在上面的配置中,名称“transactionType”是 TransactionType Enum。在这里使用 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 并且有一种方法可以使用 Enum 使用 org.hibernate.type.Type 和
TypeLocatorImpl(new TypeResolver()).custom(EnumType.class, params)

请建议这样的东西是否将用于@SqlResultSetMapping 和@ConstructorResult

最佳答案

我也遇到了这个问题,经过相当广泛的搜索后没有找到任何东西。我已经尽可能地查看源代码,据我所知,根本没有对枚举进行任何处理(尽管我当然可能会遗漏一些东西)。

我最终做的是创建一个替代构造函数,该构造函数接收枚举类型的字符串,然后将其传递给枚举的 valueOf() 方法。

例如。

更改您的 @SqlResultSetMapping 以执行此操作:

@ColumnResult(name="transactionType", type=String.class),

然后在你的类的构造函数中:
public DetailAndResult(..., String transactionType, ...) {
    ...
    this.transactionType = TransactionType.valueOf(transactionType);
    ...
}

我们必须这样做很烦人,但只要您的枚举作为字符串存储在数据库中(即实体上的列用 @Enumerated(EnumType.STRING) 注释),它就可以工作。

关于spring - JPA 2.1 中带有枚举的 @ConstructorResult,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25738728/

相关文章:

java - Spring JUnit .properties 文件不起作用

java - Spring Security 权限编程检查

java - 服务器启动时测试数据库可用性

java - 如何从 native SQL 查询中绑定(bind)实体对象中的 @Transient 字段

java - 需要用hibernate dao实现方法保存两个来自不同jsp页面的有外键关系的表

java - 如何使用Hibernate session 批量执行SQL查询

java - "No qualifying bean of type"用于 Spring Boot 中的 JPA 存储库

java - JPA Criteria 使用单表继承查询实体层次结构

java - 如何使用 JPA 注释将搜索对象映射到具有更多字段的类

java - 带有 Spring 数据 JPA : could not extract ResultSet 的 Spring Boot