【问题标题】:JPA entity without underlying table没有基础表的 JPA 实体
【发布时间】:2015-05-10 19:04:12
【问题描述】:

我想创建一个可以映射到使用 JPA 本机查询从数据库中提取的结果的类。有没有办法将没有基础表的实体映射到结果? 我提到了this 链接,它允许它休眠。这可以改用 JPA 来完成吗?

这是我想要映射结果的类。

import java.math.BigDecimal;
import javax.persistence.Entity;
@Entity
public class OpUsage {  
    String username;    
    BigDecimal number_of_clicks;    
    String accordion;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public BigDecimal getNumber_of_clicks() {
        return number_of_clicks;
    }
    public void setNumber_of_clicks(BigDecimal number_of_clicks) {
        this.number_of_clicks = number_of_clicks;
    }

    public String getAccordion() {
        return accordion;
    }

    public void setAccordion(String accordion) {
        this.accordion = accordion;
    }
}

【问题讨论】:

  • 谢谢。我没有提到这个对象将在 Jasper 报告中使用。所以我必须使用与报告中使用的名称相同的名称。

标签: java spring hibernate jpa


【解决方案1】:

JPA 2.1 specification 定义了将本地查询的结果返回到非实体类的方法

您应该查看标题 3.10.16.2 Returning Unmanaged Instances 尤其是

3.10.16.2.2 构造函数结果

到构造函数的映射是使用 ConstructorResult 指定的 SqlResultSetMapping 注释的注释元素。这 ConstructorResult 注释的 targetClass 元素指定 其构造函数对应于指定列的类。全部 对应于预期构造函数的参数的列必须是 使用 ConstructorResult 的 columns 元素指定 注释的顺序与参数列表的顺序相同 构造函数。作为构造函数结果返回的任何实体都将在 新的或分离的状态,取决于是否主 为构造的对象检索键。

示例

Query q = em.createNativeQuery(
        "SELECT c.id, c.name, COUNT(o) as orderCount, AVG(o.price) AS
        avgOrder" +
        "FROM Customer c, Orders o " +
                "WHERE o.cid = c.id " +
                "GROUP BY c.id, c.name",
        "CustomerDetailsResult");

@SqlResultSetMapping(name = "CustomerDetailsResult",
        classes = {
                @ConstructorResult(targetClass = com.acme.CustomerDetails.class,
                        columns = {
                                @ColumnResult(name = "id"),
                                @ColumnResult(name = "name"),
                                @ColumnResult(name = "orderCount"),
                                @ColumnResult(name = "avgOrder", type = Double.class)})
        })

【讨论】:

  • 这个解决方案就像一个魅力。只需确保将 SqlResultSetMapping 添加到使用 @Entity 注释的类中,而不是在非实体类中,否则 Spring 将无法识别映射。
  • 你能提供详细的例子吗?这确实给了我我正在寻找的东西,但我无法理解的是,我们将上述代码放在哪里?在存储库层还是 bean 本身?
  • 可以在此处找到放置提示:stackoverflow.com/questions/29636004/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
  • 1970-01-01
相关资源
最近更新 更多