【问题标题】:JPA - Setting entity class property from calculated column?JPA - 从计算列设置实体类属性?
【发布时间】:2011-02-25 01:12:51
【问题描述】:

我刚刚开始在 Glassfish 3 上运行的简单 Java Web 应用程序中掌握 JPA(持久性提供程序是 EclipseLink)。到目前为止,我真的很喜欢它(除了 netbeans/glassfish 交互中的错误),但我希望能够做一件事,但我不知道该怎么做。

我有一个映射到数据库表(文章)的实体类(文章)。我正在尝试对返回计算列的数据库进行查询,但我不知道如何设置 Article 类的属性,以便在调用查询时该属性由列值填充。

如果我执行常规的“从文章中选择 id、title、body”查询,我会得到一个 Article 对象列表,其中 id、title 和 body 属性已填充。这很好用。

但是,如果我执行以下操作:

Query q = em.createNativeQuery("select id,title,shorttitle,datestamp,body,true as published, ts_headline(body,q,'ShortWord=0') as headline, type from articles,to_tsquery('english',?) as q where idxfti @@ q order by ts_rank(idxfti,q) desc",Article.class);

(这是在 Postgres 上使用 tsearch2 的全文搜索 - 这是一个特定于 db 的函数,所以我使用的是 NativeQuery)

您可以看到我正在获取一个计算列,称为标题。如何向我的 Article 类添加一个标题属性,以便它被此查询填充?

到目前为止,我已经尝试将其设置为 @Transient,但最终它始终为 null。

【问题讨论】:

    标签: java postgresql jpa eclipselink


    【解决方案1】:

    可能没有什么好的方法,只能手动:

    Object[] r = (Object[]) em.createNativeQuery(
        "select id,title,shorttitle,datestamp,body,true as published, ts_headline(body,q,'ShortWord=0') as headline, type from articles,to_tsquery('english',?) as q where idxfti @@ q order by ts_rank(idxfti,q) desc","ArticleWithHeadline")
        .setParameter(...).getSingleResult();
    
    Article a = (Article) r[0];
    a.setHeadline((String) r[1]);
    

    -

    @Entity
    @SqlResultSetMapping(
        name = "ArticleWithHeadline",
        entities = @EntityResult(entityClass = Article.class),
        columns = @ColumnResult(name = "HEADLINE"))
    public class Article {
        @Transient
        private String headline;
        ...
    }
    

    【讨论】:

      【解决方案2】:

      AFAIK,JPA 不提供对计算属性的标准化支持。使用 Hibernate,可以使用 Formula,但 EclipseLink 没有直接等效项。 James Sutherland 在Re: Virtual columns (@Formula of Hibernate) 中提出了一些建议:

      没有直接的等价物(请 记录增强),但取决于 你想做什么,有办法 完成同样的事情。

      EclipseLink 定义了一个 TransformationMapping 可以映射一个 来自多个字段的计算值 值,或访问数据库。

      您可以覆盖任何 CRUD 的 SQL 使用它的类的操作 描述符的 DescriptorQueryManager。

      您可以在您的 执行该功能的数据库 并将您的实体映射到视图 而不是表格。

      您还可以执行次要 使用转换器的翻译或 属性获取/设置方法。

      还可以查看enhancement request,它有在 cmets 中使用DescriptorEventListener 的解决方案。

      当然,所有这些都是非标准的 JPA。

      【讨论】:

        猜你喜欢
        • 2012-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-31
        • 2016-03-03
        • 2011-02-03
        相关资源
        最近更新 更多