jpa 2.1中的@ConstructorResult映射

Posted

技术标签:

【中文标题】jpa 2.1中的@ConstructorResult映射【英文标题】:@ConstructorResult mapping in jpa 2.1 【发布时间】:2014-03-15 12:08:50 【问题描述】:

我正在尝试将 JPA 本机查询的返回结果映射到未映射的 Java POJO 类 并使用@ConstructorResult 如下:

@SqlResultSetMapping(name = "productDetailResult", classes = 
   @ConstructorResult(targetClass = com.rjil.mhood.jiostore.bo.ProductDetailBO.class,
   columns = 
@ColumnResult(name = "iconId", type = Integer.class),
@ColumnResult(name = "thumbnailId", type = Integer.class),
@ColumnResult(name = "screenshotId1", type = Integer.class),
@ColumnResult(name = "screenshotId2", type = Integer.class),
@ColumnResult(name = "screenshotId3", type = Integer.class),
@ColumnResult(name = "screenshotId4", type = Integer.class),
@ColumnResult(name = "screenshotId5", type = Integer.class),
@ColumnResult(name = "name", type = String.class),
@ColumnResult(name = "description", type = String.class),
@ColumnResult(name = "downloadcount", type = BigDecimal.class),
@ColumnResult(name = "artifactSize", type = String.class),
@ColumnResult(name = "creationDate", type = Date.class),
@ColumnResult(name = "updatedDate", type = Date.class),
@ColumnResult(name = "price", type = BigDecimal.class),
@ColumnResult(name = "downloadUrl", type = String.class),
@ColumnResult(name = "contentProviderName", type = String.class) ) )

POJO 类是:

public class ProductDetailBO 

    private Integer iconId;
    private Integer thumbnailId;
    private Integer screenshotId1;
    private Integer screenshotId2;
    private Integer screenshotId3;
    private Integer screenshotId4;
    private Integer screenshotId5;
    private String name;
    private String description;
    private BigDecimal downloadCount;
    private String artifactSize;
    private Date creationDate;
    private Date updatedDate;
    private BigDecimal price;
    private String downloadUrl;
    private String contentProviderName;

    public ProductDetailBO() 

    

    public ProductDetailBO(Integer iconId, Integer thumbnailId,
            Integer screenshotId1, Integer screenshotId2,
            Integer screenshotId3, Integer screenshotId4,
            Integer screenshotId5, String name, String description,
            BigDecimal downloadCount, String artifactSize, Date creationDate,
            Date updatedDate, BigDecimal price, String downloadUrl,
            String contentProviderName) 
        this.iconId = iconId;
        this.thumbnailId = thumbnailId;
        this.screenshotId1 = screenshotId1;
        this.screenshotId2 = screenshotId2;
        this.screenshotId3 = screenshotId3;
        this.screenshotId4 = screenshotId4;
        this.screenshotId5 = screenshotId5;
        this.name = name;
        this.price = price;
        this.creationDate = creationDate;
        this.updatedDate = updatedDate;
        this.description = description;
        this.downloadCount = downloadCount;
        this.artifactSize = artifactSize;
        this.downloadUrl = downloadUrl;
        this.contentProviderName = contentProviderName;

    



POJO 类包含一个匹配的构造函数,但 query.getResultList() 返回一个 Object 数组。

我想要一个像这样的ProductDetailBO

ProductDetailBO bo = query.getResultList("query","ProductDetailBO").get(0);

我该怎么做?

【问题讨论】:

【参考方案1】:

我刚刚在我的项目中对未管理的 pojo 执行了类似的映射。问题是您应该在创建查询时指向 SqlResultSetMapping 的名称,所以在您的情况下,它应该是这样的:

final Query query = entityManager.createNativeQuery(queryString, "productDetailResult");

然后是这样的:

final List<ProductDetailBO> result = Collections.checkedList(query.getResultList(), ProductDetailBO.class);

【讨论】:

以上是关于jpa 2.1中的@ConstructorResult映射的主要内容,如果未能解决你的问题,请参考以下文章

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?