试图运行一个名为查询

试图运行一个名为查询

问题描述:

我做了以下内容:试图运行一个名为查询

@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; } 

}