我刚刚开始在 Glassfish 3(持久性提供程序是 EclipseLink)上运行的简单 Java Web 应用程序中掌握 JPA。到目前为止,我真的很喜欢它(撇开 netbeans/glassfish 交互中的错误),但有一件事我希望能够做到,但我不确定该怎么做。
我有一个映射到数据库表(文章)的实体类(文章)。我正在尝试对返回计算列的数据库进行查询,但我不知道如何设置 Article 类的属性,以便在调用查询时该属性由列值填充。
如果我执行常规的“从文章中选择 id、标题、正文”查询,我会得到一个很好的 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/