我只是在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/