我想创建一个可以映射到使用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;
}
}
答案 0 :(得分:13)
JPA 2.1 specification定义了将结果从本机查询返回到非实体类的方法
您应该查看标题 3.10.16.2返回非托管实例,尤其是
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)})
})