我只是在Glassfish 3(持久性提供程序是EclipseLink)上运行的简单Java Web应用程序中了解JPA。到目前为止,我真的很喜欢它(撇开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进行的全文搜索-这是特定于数据库的功能,因此我使用的是NativeQuery)

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

到目前为止,我已经尝试将其设置为@Transient,但这最终导致它一直为null。

最佳答案

可能没有很好的方法来做到这一点,只能手动进行:

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;
    ...
}

关于java - JPA-从计算列设置实体类属性?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2927836/

10-14 21:46
查看更多