JPA 2.1 中的 @ConstructorResult 映射不能与 Hibernate 4.3.5.Final 一起正常工作

Posted

技术标签:

【中文标题】JPA 2.1 中的 @ConstructorResult 映射不能与 Hibernate 4.3.5.Final 一起正常工作【英文标题】:@ConstructorResult mapping in JPA 2.1 does not work properly with Hibernate 4.3.5.Final 【发布时间】:2014-07-15 15:08:37 【问题描述】:

我尝试将本机查询映射到非实体类。我有以下实体:

@Entity
@Table(name = "Groups")
@SqlResultSetMapping(name = "groupList", classes = 
    @ConstructorResult(targetClass = GroupListEntry.class, columns = 
        @ColumnResult(name = "id", type = Long.class),
        @ColumnResult(name = "name", type = String.class),
        @ColumnResult(name = "typeId", type = Long.class),
        @ColumnResult(name = "lastUpdateDate", type = Date.class)
    )
)
public class GroupEntity implements Serializable 
    ...

我期待着打电话

final Query query = getEntityManager().createNativeQuery(q.toString(), "groupList");
final List<GroupListEntry> result = Collections.checkedList(query.getResultList(), GroupListEntry.class);

将导致使用以下构造函数创建GroupListEntry 对象(如@ColumnResult 注释中所述)

public GroupListEntry(
        final Long groupId,
        final String name,
        final Long typeId,
        final Date lastUpdateDate) 
    ...

但事实证明,预期的构造函数依赖于底层数据库...... 在集成测试中,我使用 HSQLDB 和 JPA/Hibernate 尝试调用:

public GroupListEntry(
        final BigInteger groupId,
        final String name,
        final BigInteger typeId,
        final Date lastUpdateDate) 
    ...

而在使用 MSSQL 的开发环境中,它调用:

public GroupListEntry(
        final Integer groupId,
        final String name,
        final Integer typeId,
        final Date lastUpdateDate) 
    ...

显然每个@ColumnResult 中的指定类型被简单地忽略了。我只想有一个构造函数而不是三个。

以下是我的pom.xml 文件的片段:

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>4.3.5.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate.javax.persistence</groupId>
        <artifactId>hibernate-jpa-2.1-api</artifactId>
        <version>1.0.0.Final</version>
    </dependency>

我错过了什么吗?

执行查询后写一些注解比手动映射要优雅得多,但我不能强制它正常工作。

问候,

M

【问题讨论】:

【参考方案1】:

答案是您的期望是正确的,即 Hibernate 4.3.5 的情况如下:

显然,每个@ColumnResult 中的指定类型都被简单地忽略了。

有一个官方的 Hibernate 错误:HHH-8237 - Type mapping of @ColumnResult is ignored。如您所见,此错误已在 Hibernate 版本 4.3.6 中修复。

【讨论】:

我不记得我是如何解决的,但无论如何感谢您的回答!

以上是关于JPA 2.1 中的 @ConstructorResult 映射不能与 Hibernate 4.3.5.Final 一起正常工作的主要内容,如果未能解决你的问题,请参考以下文章

JPA 2.1 中的 @ConstructorResult 映射不能与 Hibernate 4.3.5.Final 一起正常工作

为啥我不能使用与 JPA 2.1 中的实体类型匹配的 TYPE-WHERE 子句查询实体?

您将如何使 JPA 2.1 模块独立于 JPA 实现?

JPA 2.1 Eager Fetch 属性

在 EAP 6.4.0 中使用 JPA 2.1

哪个版本的hibernate支持jpa 2.1?