java - JPA - 从计算列设置实体类属性?

标签 java postgresql jpa eclipselink

我刚刚开始在 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/

相关文章:

java - 如何使用 jdbc 将数据从 postgresql 导出到 .csv 文件?

java - android studio 上 toast 的按钮点击事件错误

java - 在多个 Jackson 映射器之间创建唯一配置

postgresql - CakePHP 在 WHERE 子句中的函数名称周围添加引号

Join 子句中的 SQL Case 表达式

java - Spring 数据 : JPA and Nested Transaction

java - 使用 Spring REST 更新一对多关系

java - 使用 Java 将 XML 转换为数据库

java - 是否可以创建一个可以向任何具体类添加功能的动态代理?

java 。隐式 super 构造函数 Settore() 未定义。必须显式调用另一个构造函数