试图运行一个名为查询
问题描述:
我做了以下内容:试图运行一个名为查询
@Entity
@SqlResultSetMapping(name="getxxxx",
[email protected](xxxx.class,
fields = {
@FieldResult(name="x1", column = "x1"),
@FieldResult(name="x2", column = "x2")}))
@NamedNativeQuery(name=" getxxxx ",
query="select x1, x2 from yyyy",
resultSetMapping=" getxxxx ")
})public class xxxx{
.
.
.
public xxxx() {
}
我得到一个错误: “表‘XXXX’解决不了”,类xxxx是不映射到我的源表, 我想查询数据库并将结果返回到我的班级 是否有可能?
答
在这种情况下,我会尝试的第一件事是删除@Entity注释。然后更改类名或本机查询名称,使其中一个为“xxxx”,其中一个为“zzzz”,以便我确信我知道运行时抱怨的是什么。
答
听起来像xxxx不应该是一个实体bean,因为JPA并不满意于在非实体bean中返回结果。您必须改用仅含SQL字符串的createNativeQuery。然后,请拨打query.getResultList()将结果作为列表(对象[])取回,并用它来填充您的非实体结果bean。
几年前,我写了blog post,这可能会帮助您使用JPA执行高级原生查询。
答
是的,这是可能的,但有点棘手。这是一个复杂的例子,应该涵盖大部分的基础。在此示例中:
- 您有一个包含到期日期的INVOICE对象;
- 每个INVOICE都与公司有多对一的关系;
- 每个发票还设有一组项目
这里的零或一个一对多关系的模式:
CREATE TABLE "public"."invoice" (
id SERIAL,
company_id int,
due_date date,
PRIMARY KEY(id)
);
CREATE TABLE "public"."item" (
id SERIAL,
invoice_id int,
description text,
PRIMARY KEY(id)
);
CREATE TABLE "public"."company" (
id SERIAL,
name text,
PRIMARY KEY(id)
);
的发票对象(难以置信旋绕例如用于起见的完整性):
@Entity
@Table(name = "invoice")
@Loader(namedQuery = "loadInvoiceObject")
@NamedNativeQuery(name="loadInvoiceObject",
query="SELECT " +
"inv.id," +
"inv.due_date," +
"co.*," +
"it.*," +
"FROM invoice inv " +
"JOIN company co ON co.id = inv.company_id " +
"LEFT OUTER JOIN item it ON it.invoice_id = inv.id " +
"WHERE inv.id = :id",
resultSetMapping = "invoicemap")
@SqlResultSetMapping(name = "invoicemap",
entities = {
@EntityResult(entityClass = Invoice.class),
@EntityResult(entityClass = Company.class),
@EntityResult(entityClass = Item.class)
}
)
public class Invoice {
private Integer id;
private Date dueDate;
private Company company;
private List<Item> items = new ArrayList<Item>();
public Invoice() { /* no-args constructor */ }
@Id
@Column(name = "id", nullable = false)
public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
@Column(name = "due_date")
@Temporal(TemporalType.DATE)
public Date getDueDate() { return dueDate; }
public void setDueDate(Date dueDate) { this.dueDate = dueDate; }
@ManyToOne(optional = false)
@JoinColumn(name = "company_id", nullable = false)
public Company getCompany() { return company; }
public void setCompany(Company company) { this.company = company; }
@OneToMany(mappedBy = "invoice")
public List<Item> getItems() { return items; }
public void setItems(List<Item> items) { this.items = items; }
}
Item对象:
@Entity
@Table(name = "item")
public class Item {
private Integer id;
private String description;
private Invoice invoice;
public Item() { /* no-args constructor */ }
@Id
@Column(name = "id", nullable = false)
public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
@Column(name = "description")
public String getDescription() { return description; }
public void setDescription(String description) { this.description = description; }
@ManyToOne(optional = false)
@JoinColumn(name = "invoice_id", nullable = false)
public Invoice getInvoice() { return invoice; }
public void setInvoice(Invoice invoice) { this.invoice = invoice; }
}
公司对象:
@Entity
@Table(name = "company")
public class Company {
private Integer id;
private String name;
private List<Invoice> invoices = new ArrayList<Invoice>();
public Company() { /* no-args constructor */ }
@Id
@Column(name = "id", nullable = false)
public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
@Column(name = "name")
public String getName() { return name; }
public void setName(String name) { this.name = name; }
@OneToMany(mappedBy = "company")
public List<Invoice> getInvoices() { return invoices; }
public void setInvoices(List<Invoice> invoices) { this.invoices = invoices; }
}