没有基础表的 JPA 实体

2022-09-01 23:45:52

我想创建一个类,该类可以映射到使用JPA本机查询从数据库中提取的结果。有没有办法将没有基础表的实体映射到结果?我提到了这个链接,它允许它休眠。这可以用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;
    }
}

答案 1

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

您应该查看标题 3.10.16.2 返回非托管实例,尤其是

3.10.16.2.2 构造函数结果

到构造函数的映射是使用 SqlResultSetMapping 注释的构造函数Result注释元素指定的。构造函数Result批注的 targetClass 元素指定其构造函数对应于指定列的类。与预期构造函数的参数对应的所有列都必须使用构造函数Result批注的 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)})
        })

答案 2

推荐