JPA 2.1中的@ConstructorResult映射与Hibernate 4.3.5.Final无法正常工作

时间:2014-07-15 15:08:37

标签: java hibernate jpa jpa-2.1

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

@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>

我错过了什么吗?

在执行查询后,编写一些注释比手动映射要优雅得多,但我无法强制它正常工作。

此致

中号

1 个答案:

答案 0 :(得分:1)

答案是您的期望是正确的,即Hibernate 4.3.5符合以下条件:

  

显然,每个@ColumnResult中的指定类型都将被忽略。

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